複数のトランザクション、他のローン金額、および顧客ごとの支払いがあるため、直接JOIN
を実行することはできません。 行の複製が発生し、値が正しくなくなるため、テーブルを相互に結合します。代わりに、SUM
クライアントベースの各テーブル内のすべての値前 JOIN
を実行する 。さらに、一部のクライアントには各テーブルにエントリがないため、LEFT JOIN
を使用する必要があります sおよびCOALESCE
空の行によってSUMがNULL
にならないように結果を調整します 。このクエリにより、必要な結果が得られます:
SELECT c.id, c.name,
COALESCE(t.transactions, 0) + COALESCE(o.amounts, 0) - COALESCE(p.payments, 0) AS amount
FROM client c
LEFT JOIN (SELECT id, SUM(load_amount) + SUM(additional) AS transactions
FROM transaction
GROUP BY id) t on t.id = c.id
LEFT JOIN (SELECT id, SUM(amount) AS amounts
FROM other_loan
GROUP BY id) o ON o.id = c.id
LEFT JOIN (SELECT id, SUM(payment_amount) AS payments
FROM payment
GROUP BY id) p ON p.id = c.id
GROUP BY c.id
出力(サンプルデータ用):
id name amount
1 Robin 8718
2 Cinderella 21
3 Leomar 0