Поскольку у вас есть несколько транзакций, других сумм займов и платежей на одного клиента, вы не можете сделать прямые 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
Демонстрация по SQLFiddle