Du behöver en enda rad per faktura, så samla betalningsfaktura
först – bäst innan du går med.
När hela tabellen är vald är det vanligtvis snabbast att samla först och gå med senare
:
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);
VÄNSTER JOIN
är väsentligt här. Du vill inte tappa fakturor som inte har några motsvarande rader i betalningsfaktura
(ännu), vilket skulle hända med en vanlig JOIN
.
Använd därför COALESCE ()
för summan av betalningar, som kan vara NULL.
SQL Fiddle med förbättrat testfall.