Anda memerlukan satu baris per faktur, jadi gabungkan payment_invoice
pertama - terbaik sebelum Anda bergabung.
Saat seluruh tabel dipilih, biasanya yang tercepat adalah gabungkan dulu dan bergabung nanti
:
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
sangat penting di sini. Anda tidak ingin kehilangan faktur yang tidak memiliki baris yang sesuai di payment_invoice
(belum), yang akan terjadi dengan JOIN
biasa .
Oleh karena itu, gunakan COALESCE()
untuk jumlah pembayaran, yang mungkin NULL.
SQL Fiddle dengan kasus uji yang ditingkatkan.