Sie benötigen eine einzelne Zeile pro Rechnung, also aggregieren Sie payment_invoice
zuerst - am besten, bevor Sie beitreten.
Wenn der gesamte Tisch ausgewählt ist, ist es normalerweise am schnellsten, zuerst aggregieren und später beitreten
:
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
ist hier unerlässlich. Sie möchten keine Rechnungen verlieren, die keine entsprechenden Zeilen in payment_invoice
haben (noch), was mit einem einfachen JOIN
passieren würde .
Verwenden Sie dementsprechend COALESCE()
für die Summe der Zahlungen, die NULL sein kann.
SQL-Fiddle mit verbessertem Testfall.