Potrzebujesz jednego wiersza na fakturę, więc zagreguj payment_invoice
pierwszy - najlepiej zanim dołączysz.
Gdy zaznaczony jest cały stół, zazwyczaj najszybciej jest najpierw agreguj i dołącz później
:
SELECT to_char(date_trunc('month', i.create_datetime), 'MM/YYYY') AS month
, count(*) AS total_invoice_count
, (sum(i.total) - COALESCE(sum(pi.paid), 0)) AS outstanding_balance
FROM invoice i
LEFT JOIN (
SELECT invoice_id AS id, sum(amount) AS paid
FROM payment_invoice pi
GROUP BY 1
) pi USING (id)
GROUP BY date_trunc('month', i.create_datetime)
ORDER BY date_trunc('month', i.create_datetime);
DOŁĄCZENIE LEWE
jest tutaj niezbędna. Nie chcesz tracić faktur, które nie mają odpowiadających wierszy w payment_invoice
(jeszcze), co zdarzyłoby się przy zwykłym JOIN
.
W związku z tym użyj COALESCE ()
dla sumy płatności, która może wynosić NULL.
Skrzypce SQL z ulepszonym przypadkiem testowym.