U heeft één rij per factuur nodig, dus verzamel payment_invoice
eerst - het beste voordat je meedoet.
Als de hele tafel is geselecteerd, is het meestal het snelst om eerst samenvoegen en later meedoen
:
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);
LEFT JOIN
is hier essentieel. U wilt geen facturen kwijtraken die geen corresponderende rijen hebben in payment_invoice
(nog), wat zou gebeuren met een gewone JOIN
.
Gebruik daarom COALESCE()
voor de som van betalingen, die NULL kan zijn.
SQL Fiddle met verbeterde testcase.