Witajcie.

Mamy 2 tabele:

Pierwsza: 'pozyczka' zawiera pola
id,
kwota_pozyczki,
koszt_operacyjny,
oprocentowanie,
marza,
pozyczkobiorca_id,
pozyczkodawca_id,
itd

Jeśli mamy pożyczkę 1000 zł na rok
Oprocentowanie: 10% (100 zł)
Koszt operacyjny: 100 zł
To marża wychodzi 200 zł (przy pożyczce na pół roku wyszłoby 150 zł marży jak się zapewne domyślacie)

Druga tabela to: 'rata', zawiera kolumny:
id,
pozyczka_id, (relacyjna)
kwota_raty,
termin,(datetime)
splacona, (bool)
data_splaty, (datetime)

I teraz mam ID inwestora powiedzmy 1045 i datę w formacie "2013-03"
Mając te dane (ID i datę) potrzebuję pobrać z bazy kwotę przychodu inwestora w danym miesiącu.
Rekordów jest dużo i ruch nie mały i nie mogę ogarnąć jak to najwydajniej zrobić. Macie jakieś pomysły?

Wyskrobałem coś takiego:

  1. SELECT SUM( (ar.suma - ar.kwota) * ( ar.raty / COUNT(rata.id) ) ) AS suma
  2. FROM
  3. aukcja_relacja ar LEFT JOIN
  4. rata ON rata.id_relacja=ar.id
  5. WHERE
  6. ar.id_dawca = '75' AND
  7. (rata.potwierdzenie = 1 OR rata.potwierdzenie = 2) AND
  8. YEAR(rata.data_splaty) = YEAR(NOW()) AND
  9. MONTH(rata.data_splaty) = MONTH(NOW())
  10. GROUP BY
  11. ar.id


Ale "COUNT(rata.id)" wywala error:
Cytat
SQL query failed with error #1111 Invalid use of group function


(faktyczne nazewnictwo kolumn w bazie jest lekko inne niż na pierwszym spisie)

Załatwiłem sprawę tak:

  1. SELECT ( (sum(ar.suma) - sum(ar.kwota)) * (COUNT(rata.id) / SUM(ar.raty) ) ) AS suma,
  2. concat( YEAR(rata.data_splaty) , '-', MONTH(rata.data_splaty) ) AS DATA
  3. FROM
  4. aukcja_relacja ar LEFT JOIN
  5. rata ON rata.id_relacja=ar.id AND (rata.potwierdzenie = 1 OR rata.potwierdzenie = 2)
  6. WHERE
  7. ar.id_dawca = '{$_SESSION['uid']}'
  8. AND (rata.potwierdzenie = 1 OR rata.potwierdzenie = 2)
  9. GROUP BY
  10. MONTH(rata.data_splaty)
  11. ,ar.id
  12. ORDER BY
  13. DATA DESC


  1. $result = $db->query($sql)->res();
  2.  
  3. foreach ($result as $r) {
  4. $newArr[$r['data']] += $r['suma'];
  5. }
  6.  


Jest w MySQL jakiś sposób na zagnieżdżone funkcje agregujące?
Np. COUNT( SUM( pole ) )
Chciałbym rozwiązać ten problem bez PHPowego przerobienia tablicy jednak nie mogę odpowiednio pogrupować danych z poziomu SQLa...