¿Por que se suma dos veces el resultado al usar SUM () con JOIN?

publicado por: Anonymous

Hola tengo la siguiente pregunta y es que la suma se duplica y no se por que,suma dos veces el resultado al usar SUM() con JOIN en Mysql. Cada resultado sale el doble en INVERSION_VALOR sale 492 en ves de 246,en INVERSION_VALOR sale 20246 en ves de 10123

SELECT I.FECHA      AS INV_FECHA,
       SUM(I.VALOR) AS INVERSION_VALOR, 
       SUM(G.VALOR) AS GASTO_VALOR 
       FROM INVERSION AS I 
       INNER JOIN GASTOS AS G ON I.FECHA = G.FECHA 
       GROUP BY(I.FECHA)`

solución

Por lo que dices, necesitas sumar las filas de las dos tablas por fecha. Para esto, deberías en primer lugar agrupar por fecha cada tabla de forma independiente y luego sí unirlas mediante un join. Si haces el join directamente vas a duplicar filas en alguna o en ambas tablas, siempre que tengas más de una fila para una misma fecha en alguna de las dos tablas o en ambas.

Lo que te decía, sería algo así:

SELECT  I.FECHA,
        I.INVERSION_VALOR,
        G.GASTO_VALOR
        FROM (SELECT   FECHA,
                       SUM(VALOR) AS INVERSION_VALOR
                       FROM INVERSION
                       GROUP BY FECHA
              ) I
        LEFT JOIN (SELECT  FECHA,
                           SUM(VALOR) AS GASTO_VALOR 
                           FROM GASTOS
                           GROUP BY(FECHA)
              ) G
              ON G.FECHA = I.FECHA

Esto tiene un eventual problema, así como está la consulta te traerá todas las filas de inversion y solo las que coincidan con gastos. Esto se solucionaría fácilmente si mysql tuviera un FULL OUTER JOIN, lamentablemente no es así hay que emularlo de esta forma:

SELECT  I.FECHA,
        I.INVERSION_VALOR,
        G.GASTO_VALOR
        FROM (SELECT   FECHA,
                       SUM(VALOR) AS INVERSION_VALOR
                       FROM INVERSION
                       GROUP BY FECHA
              ) I
        LEFT JOIN (SELECT  FECHA,
                           SUM(VALOR) AS GASTO_VALOR 
                           FROM GASTOS
                           GROUP BY(FECHA)
              ) G
              ON G.FECHA = I.FECHA

UNION

SELECT  I.FECHA,
        I.INVERSION_VALOR,
        G.GASTO_VALOR
        FROM (SELECT   FECHA,
                       SUM(VALOR) AS INVERSION_VALOR
                       FROM INVERSION
                       GROUP BY FECHA
              ) I
        RIGHT JOIN (SELECT  FECHA,
                           SUM(VALOR) AS GASTO_VALOR 
                           FROM GASTOS
                           GROUP BY(FECHA)
              ) G
              ON G.FECHA = I.FECHA
        WHERE I.FECHA IS NULL

Si en alguna de las dos tablas no tuvieras filas ten en cuenta que obviamente las columnas de importes retornarán null, si prefieres mostrar el valor 0, deberías usar un IFNULL(G.GASTO_VALOR, 0) o IFNULL(G.INVERSION_VALOR, 0)

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *