Du skal bruge en enkelt række pr. faktura, så samle payment_invoice
først - bedst før du tilmelder dig.
Når hele bordet er valgt, er det typisk hurtigst at saml først og tilmeld dig senere
:
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
er afgørende her. Du ønsker ikke at miste fakturaer, der ikke har nogen tilsvarende rækker i payment_invoice
(endnu), hvilket ville ske med en almindelig JOIN
.
Brug derfor COALESCE ()
for summen af betalinger, som kan være NULL.
SQL violin med forbedret testcase.