Add columns with the SUM SQL function, perform the sum but at twice the expected value

0

Hello I have the following sentence, the bad thing is that I'm adding the double, for example to execute it throws me the following values:

1 | test | x | x | 168 | 92 | 2 | 8

I should be returning something like that

1 | test | 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
    
asked by Carlos Baez 01.06.2017 в 05:43
source

1 answer

0

It seems that the INNER JOIN are adding more records and that is why the sums are doubled; therefore you could try to make SUM before JOIN .

Furthermore, it is important to note that you also need to group by total_casos_disenados.Estado otherwise the data will not be correct (ie it will show you the total of all the elements of Estado , but you will only see the first label).

Considering the above, your query should look like this:

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;

In case you want to keep the status behavior as it was (i.e. get all but under the same label), make these two adjustments:

  • Change total_casos_disenados.Estado, in SELECT per 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
    
  • Delete , total_casos_disenados.Estado of GROUP BY :

    GROUP BY
        proyecto.IDProyectoSpiraTest
    
  • answered by 01.06.2017 / 06:35
    source