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:
SELECT SUM( (ar.suma - ar.kwota) * ( ar.raty / COUNT(rata.id) ) ) AS suma FROM aukcja_relacja ar LEFT JOIN rata ON rata.id_relacja=ar.id WHERE ar.id_dawca = '75' AND (rata.potwierdzenie = 1 OR rata.potwierdzenie = 2) AND YEAR(rata.data_splaty) = YEAR(NOW()) AND MONTH(rata.data_splaty) = MONTH(NOW()) GROUP BY 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:
SELECT ( (sum(ar.suma) - sum(ar.kwota)) * (COUNT(rata.id) / SUM(ar.raty) ) ) AS suma, concat( YEAR(rata.data_splaty) , '-', MONTH(rata.data_splaty) ) AS DATA FROM aukcja_relacja ar LEFT JOIN rata ON rata.id_relacja=ar.id AND (rata.potwierdzenie = 1 OR rata.potwierdzenie = 2) WHERE ar.id_dawca = '{$_SESSION['uid']}' AND (rata.potwierdzenie = 1 OR rata.potwierdzenie = 2) GROUP BY MONTH(rata.data_splaty) ,ar.id ORDER BY DATA DESC
$result = $db->query($sql)->res(); foreach ($result as $r) { $newArr[$r['data']] += $r['suma']; }
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...