Na každou fakturu potřebujete jeden řádek, proto agregujte payment_invoice
první – nejlépe, než se připojíte.
Když je vybrána celá tabulka, je obvykle nejrychlejší aggregate first a připojit se později
:
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
je zde zásadní. Nechcete ztratit faktury, které nemají žádné odpovídající řádky v payment_invoice
(zatím), což by se stalo s prostým JOIN
.
V souladu s tím použijte COALESCE()
pro součet plateb, který může být NULL.
SQL Fiddle s vylepšeným testovacím případem.