Имате нужда от един ред на фактура, така че обобщете 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 с подобрен тестов случай.