請求書ごとに1行が必要なので、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
に対応する行がない請求書を失いたくない (まだ)、これは単純な<code> JOINで発生します 。
したがって、COALESCEを使用してください()
NULLの可能性がある支払いの合計。
SQLフィドル テストケースが改善されました。