आपको प्रति चालान एक पंक्ति की आवश्यकता है, इसलिए payment_invoice
. को एकत्रित करें पहले - आपके शामिल होने से पहले सबसे अच्छा।
जब पूरी तालिका का चयन किया जाता है, तो यह आमतौर पर पहले एग्रीगेट करें और बाद में शामिल हों
:
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
यहाँ आवश्यक है। आप उन चालानों को खोना नहीं चाहते जिनकी payment_invoice
. में कोई संगत पंक्तियाँ नहीं हैं (अभी तक), जो एक सादे JOIN
. के साथ होगा .
तदनुसार, COALESCE()
भुगतानों के योग के लिए, जो NULL हो सकता है।
SQL Fiddle बेहतर परीक्षण मामले के साथ।