Hai bisogno di una singola riga per fattura, quindi aggrega payment_invoice
first - preferibilmente prima di entrare.
Quando viene selezionato l'intero tavolo, in genere è più veloce prima aggrega e unisciti più tardi
:
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
è essenziale qui. Non vuoi perdere fatture che non hanno righe corrispondenti in payment_invoice
(ancora), cosa che accadrebbe con un semplice JOIN
.
Di conseguenza, usa COALESCE()
per la somma dei pagamenti, che potrebbe essere NULL.
SQL Fiddle con test case migliorato.