Bạn cần một hàng cho mỗi hóa đơn, vì vậy hãy tổng hợp payment_invoice
đầu tiên - tốt nhất là trước khi bạn tham gia.
Khi toàn bộ bảng được chọn, thường là nhanh nhất để tổng hợp trước và tham gia sau
:
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
là điều cần thiết ở đây. Bạn không muốn mất các hóa đơn không có hàng tương ứng trong payment_invoice
(chưa), điều này sẽ xảy ra với JOIN
đơn giản .
Theo đó, hãy sử dụng COALESCE()
đối với tổng số tiền thanh toán, có thể là NULL.
SQL Fiddle với trường hợp thử nghiệm được cải thiện.