Suma necesaria para la base de datos MySQL
Espero que me puedan ayudar con la siguiente consulta:
Tengo las siguientes 2 tablas:


tablaA.monedaA siempre será igual a la monedaB en el elemento relacionado en la tablaB.
Necesito devolver los siguientes resultados:

Básicamente, en los resultados necesito devolver todos los elementos de la tabla A + un resumen de las entradas de la tabla B. He estado intentando varias consultas, pero parece que no puedo encontrar oraciones para esto. Los que probé no devolvían los datos del elemento 4 (tenga en cuenta que el elemento 4 no tiene entradas en la tabla B).
Mostrar la mejor respuesta
Publicado : 7 March, 2018 @ 13:39
¿Qué consultas has probado?
Publicado : 7 March, 2018 @ 14:05
Publicado : 7 March, 2018 @ 21:04
Creo que algo como esto funcionaría bien:
select
tableA.idA,
tableA.currencyA as currency,
tableA.totalA as total,
case when (sum(tableB.amountB) is null) then 0 else sum(tableB.amountB) end as 'in',
case when (sum(tableB.amountB) is null) then tableA.totalA else
tableA.totalA-sum(tableB.amountB) end as 'difference'
from
tableA left outer join tableB on tableA.idA=tableB.idA
group by tableA.idA;
Publicado : 7 March, 2018 @ 16:50
Un pequeño enfoque claro de lo que necesita
SELECT z.*,
(z.totalA - z.in) AS difference
FROM (
SELECT a.idA, a.currencyA, a.totalA,
IF(b.idB IS NOT NULL, SUM(b.amountA), 0) AS `in`
FROM tableA a
LEFT JOIN tableB b ON a.idA = b.idA
GROUP BY a.idA
) z;
Salida
idA currencyA totalA in difference
1 usd 1000 550 450
2 usd 2000 700 1300
3 eur 3000 600 2400
4 usd 4000 0 4000
Demostración de trabajo
Publicado : 8 March, 2018 @ 07:09
¡Gracias Samir! La consulta que publicaste funciona muy bien. ¿Sabes si hay alguna diferencia en términos de rendimiento entre tu consulta y la que he publicado a continuación? stackoverflow.com/a/49157229/1835537
Publicado : 8 March, 2018 @ 09:59
En su consulta, calculará SUM
y verificará la condición 'IF/ELSE' dos veces, lo cual no es un cuello de botella de rendimiento, pero se puede simplificar y optimizar un poco más con el que publiqué.
Publicado : 8 March, 2018 @ 16:02