Ponieważ masz wiele transakcji, inne kwoty pożyczek i płatności na klienta, nie możesz wykonać prostego JOIN
tabel do siebie, ponieważ spowoduje to replikację wierszy, co skutkuje nieprawidłowymi wartościami. Zamiast tego SUM
wszystkie wartości w każdej tabeli na podstawie klienta przed wykonując JOIN
. Dodatkowo, ponieważ niektórzy klienci nie mają wpisów w każdej tabeli, musisz użyć LEFT JOIN
s i COALESCE
na wynikach, aby puste wiersze nie powodowały, że SUM stają się NULL
. To zapytanie powinno dać pożądane wyniki:
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
Dane wyjściowe (dla przykładowych danych):
id name amount
1 Robin 8718
2 Cinderella 21
3 Leomar 0