Witam,
Przygotowuję kreator raportu rozliczeń klientów porównujący dane historyczne (użytkownik wybiera trzy daty zrzutów z bieżącego i dwóch ostatnich miesięcy w programie) i potrzebowałbym pomocy w napisaniu zapytania (PostgreSQL), które zwróci mi w wierszach agregację dat sald (po miesiącach w pierwszej kolumnie), a w kolejnych kolumnach odpowiednio sumę sald wszystkich klientów aktywnych, którzy mają sumaryczną kwotę swoich faktur >0 (uwzględnienie tylko klientów z zaległościami), nieaktywnych z zaległością oraz total. Chodzi mniej więcej o coś takiego:
Próbowałem już zapytania jak poniżej:
select
to_char(data_salda, 'YYYY-MM') as data,
(Case when sum(kwota)>'0,00' and status='Aktywny' then sum(kwota) else '0,00' end) Aktywni,
(Case when sum(kwota)>'0,00' and status='Nieaktywny' then sum(kwota) else '0,00' end) Nieaktywni,
(Case when sum(kwota)>'0,00' then sum(kwota) else '0,00' end) Razem
from klienci_rozliczenia_historia where (data_salda='.......' or data_salda='......' or data_salda='.....')
group by data_salda,status,to_char(data_salda, 'YYYY-MM') order by to_char(data_salda, 'YYYY-MM')
Jednak (na przykładzie innych faktycznych testowych danych w mojej bazie) agregacja nie działa poprawnie - wrzuca każdy status do osobnego wiersza (miesiąc lipiec):
Tym samym lipiec mam 3 razy + jakieś zera. Wydaje mi się, że coś jest nie tak z Case'ami i gdzieś chyba powinienem jeszcze wcisnąć uwzględnienie per klient:
over (partition by klient)
Poza tym sumowanie też działa niepoprawnie, gdy robię to ręcznie w Excelu w celu sprawdzenia.
Generalnie idea jest taka, aby mając bazę operacji finansowych klientów, wybrać do raportu tylko sumy dodatnich sald per klient. Jeśli suma kwot faktur firmy A jest większa od zero, ma ona zostać uwzględniony w sumie całkowitej. Jeśli jest mniejsza, firma ma być pominięta. Dodatkowo sumy powinny zostać zagregowane do miesięcy.
Będę wdzięczny za pomoc. Z góry dziękuję.