Debido a que tiene múltiples transacciones, otros montos de préstamos y pagos por cliente, no puede hacer un JOIN
directo. de las tablas entre sí, ya que provocará la replicación de filas, lo que dará como resultado valores incorrectos. En su lugar, SUM
todos los valores dentro de cada tabla por cliente antes haciendo JOIN
. Además, dado que algunos clientes no tienen entradas en cada tabla, debe usar LEFT JOIN
s y COALESCE
en los resultados para que las filas vacías no hagan que SUM se convierta en NULL
. Esta consulta debería darte los resultados que deseas:
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
Salida (para sus datos de muestra):
id name amount
1 Robin 8718
2 Cinderella 21
3 Leomar 0