Parce que vous avez plusieurs transactions, d'autres montants de prêt et paiements par client, vous ne pouvez pas faire un JOIN
direct des tables les unes aux autres car cela entraînera la réplication des lignes, ce qui entraînera des valeurs incorrectes. Au lieu de cela, nous SUM
toutes les valeurs de chaque table sur une base client avant faire le JOIN
. De plus, étant donné que certains clients n'ont pas d'entrées dans chaque table, vous devez utiliser LEFT JOIN
s et COALESCE
sur les résultats afin que les lignes vides ne fassent pas devenir les SOMMES NULL
. Cette requête devrait vous donner les résultats souhaités :
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
Sortie (pour vos exemples de données) :
id name amount
1 Robin 8718
2 Cinderella 21
3 Leomar 0