Тъй като имате множество транзакции, други суми на заеми и плащания на клиент, не можете да направите направо 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