Como você tem várias transações, outros valores de empréstimo e pagamentos por cliente, não é possível fazer um
JOIN
direto das tabelas entre si, pois isso causará a replicação de linhas, resultando em valores incorretos. Em vez disso, SUM
todos os valores dentro de cada tabela com base no cliente antes fazendo o JOIN
. Além disso, como alguns clientes não possuem entradas em cada tabela, você deve usar LEFT JOIN
se COALESCE
nos resultados para que linhas vazias não façam com que SUMs se tornem NULL
. Esta consulta deve fornecer os resultados desejados: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
Saída (para seus dados de amostra):
id name amount
1 Robin 8718
2 Cinderella 21
3 Leomar 0
Demonstração no SQLFiddle