Sumar columnas con la funcion SUM SQL, realiza la suma pero al doble del valor esperado

publicado por: Anonymous

Hola tengo la siguiente sentencia, lo malo es que me esta sumando el doble, por ejemplo al ejecutarla me arroja los siguientes valores:

1|prueba|x|x|168|92|2|8

Me tendría que estar devolviendo algo así

1|prueba|x|x|84 |46|1|4

SELECT
    proyecto.IDProyectoSpiraTest,
    proyecto.NombreProyecto,
    total_casos_disenados.Estado,
    complemento.Estado AS Ejecucion,
    SUM(total_casos_disenados.Total_Casos) AS SUM_DISE,
    SUM(CASE WHEN total_casos_disenados.Estado ='Passed' THEN total_casos_disenados.Total_Casos ELSE 0 END) AS SUM_PASSED,
    SUM(CASE WHEN defectos_proyecto_estado.Estatus = 'Closed' THEN defectos_proyecto_estado.Total ELSE 0 END) AS SUM_CLOSED,
    SUM(defectos_proyecto_estado.Total) AS SUM_ESTADO
FROM
    proyecto
    INNER JOIN total_casos_disenados ON proyecto.NombreProyecto = total_casos_disenados.NombrePRoyecto
    INNER JOIN complemento ON proyecto.NombreProyecto = complemento.NombreProyecto
    INNER JOIN defectos_proyecto_estado ON proyecto.IDProyectoSpiraTest =defectos_proyecto_estado.IDProyectoSpiraTest
WHERE
    proyecto.NombreProyecto = total_casos_disenados.NombreProyecto
    AND proyecto.Activo = 1
    GROUP BY proyecto.IDProyectoSpiraTest
    ORDER by proyecto.IDProyectoSpiraTest

solución

Al parecer los INNER JOIN están agregando más registros y por eso se duplican las sumas; por lo tanto podrías intentar hacer los SUM antes de los JOIN.

Además, es importante notar que necesitas también agrupar por total_casos_disenados.Estado de lo contrario los datos no serán correctos (i.e. te mostrará el total de todos los elementos de Estado, pero únicamente verás la primer etiqueta).

Considerando lo anterior, tu query debería verse así:

SELECT
    proyecto.IDProyectoSpiraTest,
    proyecto.NombreProyecto,
    total_casos_disenados.Estado,
    complemento.Estado AS Ejecucion,
    SUM_DISE,
    SUM_PASSED,
    SUM_CLOSED,
    SUM_ESTADO
FROM
    proyecto INNER JOIN
    (SELECT
        NombreProyecto,
        Estado,
        SUM(Total_Casos) AS SUM_DISE,
        SUM(CASE WHEN Estado = 'Passed' THEN Total_Casos ELSE 0 END) AS SUM_PASSED
     FROM total_casos_disenados
     GROUP BY NombreProyecto, Estado
    ) total_casos_disenados
    ON proyecto.NombreProyecto = total_casos_disenados.NombreProyecto INNER JOIN
    complemento
    ON proyecto.NombreProyecto = complemento.NombreProyecto INNER JOIN
    (SELECT
        IDProyectoSpiraTest,
        SUM(Total) AS SUM_ESTADO,
        SUM(CASE WHEN Estatus = 'Closed' THEN Total ELSE 0 END) AS SUM_CLOSED
     FROM defectos_proyecto_estado
     GROUP BY IDProyectoSpiraTest
    ) defectos_proyecto_estado
    ON proyecto.IDProyectoSpiraTest = defectos_proyecto_estado.IDProyectoSpiraTest
WHERE
    proyecto.NombreProyecto = total_casos_disenados.NombreProyecto AND
    proyecto.Activo = 1
GROUP BY
    proyecto.IDProyectoSpiraTest, total_casos_disenados.Estado
ORDER BY
    proyecto.IDProyectoSpiraTest;

En caso que quieras mantener el comportamiento de estado como estaba (i.e. obtener todos pero bajo la misma etiqueta), realiza estos dos ajustes:

  1. Cambia total_casos_disenados.Estado, en SELECT por MAX(total_casos_disenados.Estado) AS Estado,:

    SELECT
        proyecto.IDProyectoSpiraTest,
        proyecto.NombreProyecto,
        total_casos_disenados.Estado,
        complemento.Estado AS Ejecucion,
        SUM_DISE,
        SUM_PASSED,
        SUM_CLOSED,
        SUM_ESTADO
    
  2. Borra , total_casos_disenados.Estado de GROUP BY:

    GROUP BY
        proyecto.IDProyectoSpiraTest
    
Respondido por: Anonymous

Leave a Reply

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