Group records by column without the null value (Sql Server)

0

Dear friends, I have the following query:

IF OBJECT_ID('TEMPDB..#TOTALHORAS') IS NOT NULL
BEGIN
    DROP TABLE #TOTALHORAS;
END 

SET LANGUAGE SPANISH; 
CREATE TABLE #TOTALHORAS(
EMPLSECCION VARCHAR(100),
EMPLMINUTOS VARCHAR(100),
EMPLMINUTOSN VARCHAR(100),
EMPLVALORA NUMERIC(18,2),
EMPLVALORN NUMERIC(18,2),
EMPLFEC INT);

INSERT INTO #TOTALHORAS(EMPLSECCION,EMPLMINUTOS,EMPLVALORA)
SELECT  
    S.SECCION AS SECCION,   
    CONVERT(varchar(4),isnull((SUM((DATEPART(HOUR, M.Mov_NHora) * 60) + DATEPART(MINUTE, M.Mov_NHora)) / 60),0)) +':'+ CONVERT(varchar(4),isnull(SUM((DATEPART(HOUR, M.Mov_NHora) * 60) + DATEPART(MINUTE, M.Mov_NHora)) % 60,0)) TOTALMIN, 
    SUM(M.Mov_VHora)AS TOTALHORASPAG
    FROM HIS_MOV_HORA M
    INNER JOIN TBL_EMPLEADO E
    ON E.EMPL_COD = M.Mov_CodEmpleado AND E.EMPL_FECH_AF > 0 AND (M.Mov_Fecha>='29/10/2018' AND M.Mov_Fecha<='04/11/2018')  
    INNER JOIN TBL_SECCION S
    ON M.Mov_CodSecuencia=S.ID_CODIGO  
    GROUP BY S.ID_CODIGO, S.CUENTA_CONTABLE_AF, S.SECCION
    ORDER BY S.SECCION ASC

INSERT INTO #TOTALHORAS(EMPLSECCION,EMPLMINUTOSN,EMPLVALORN)
SELECT  
    S.SECCION AS SECCION,   
    CONVERT(varchar(4),isnull((SUM((DATEPART(HOUR, M.Mov_NHora) * 60) + DATEPART(MINUTE, M.Mov_NHora)) / 60),0)) +':'+ CONVERT(varchar(4),isnull(SUM((DATEPART(HOUR, M.Mov_NHora) * 60) + DATEPART(MINUTE, M.Mov_NHora)) % 60,0)) TOTALMIN, 
    SUM(M.Mov_VHora)AS TOTALHORASPAG
    FROM HIS_MOV_HORA M
    INNER JOIN TBL_EMPLEADO E
    ON E.EMPL_COD = M.Mov_CodEmpleado AND E.EMPL_FECH_AF = 0 AND (M.Mov_Fecha>='29/10/2018' AND M.Mov_Fecha<='04/11/2018')
    INNER JOIN TBL_SECCION S
    ON M.Mov_CodSecuencia=S.ID_CODIGO
    GROUP BY S.ID_CODIGO, S.CUENTA_CONTABLE_AF, S.SECCION
    ORDER BY S.SECCION ASC




;WITH VISTA AS(
SELECT DISTINCT EMPLSECCION,
(SELECT ISNULL (CASE WHEN (EMPLMINUTOS>'0') THEN EMPLMINUTOS END,'00:00')) AS EMPLMINUTOS,
(SELECT ISNULL (CASE WHEN (EMPLVALORA>0) THEN EMPLVALORA END,0))AS EMPLVALORA,
(SELECT ISNULL (CASE WHEN (EMPLMINUTOSN>'0') THEN EMPLMINUTOSN END,'00:00'))AS EMPOLMINUTOSN,
(SELECT ISNULL (CASE WHEN (EMPLVALORN>0) THEN EMPLVALORN END,0)) AS EMPLVALORN
FROM #TOTALHORAS
GROUP BY EMPLSECCION,EMPLMINUTOS,EMPLVALORA,EMPLMINUTOSN,EMPLVALORN)

SELECT DISTINCT EMPLSECCION,EMPLMINUTOS,SUM (EMPLVALORA)AS EMPLVALORA,EMPOLMINUTOSN,SUM(EMPLVALORN) AS EMPLVALORN FROM VISTA GROUP BY EMPLSECCION,EMPLMINUTOS,EMPOLMINUTOSN

And it throws me the following result:

But I want to visualize it in the following way:

If someone could help me, indicating how I could modify the query so that it looks like the second image.

Beforehand. Thanks for your help.

    
asked by Carrobe90 16.11.2018 в 21:43
source

2 answers

1
    IF OBJECT_ID('TEMPDB..#TOTALHORAS') IS NOT NULL
BEGIN
    DROP TABLE #TOTALHORAS;
END 

SET LANGUAGE SPANISH; 
CREATE TABLE #TOTALHORAS(
EMPLSECCION VARCHAR(100),
EMPLMINUTOS VARCHAR(100),
EMPLMINUTOSN VARCHAR(100),
EMPLVALORA NUMERIC(18,2),
EMPLVALORN NUMERIC(18,2),
EMPLFEC INT);

INSERT INTO #TOTALHORAS(EMPLSECCION,EMPLMINUTOS,EMPLVALORA)
SELECT  
    S.SECCION AS SECCION,   
    M.MOV_NHORA AS HORAS,   
    (M.MOV_VHORA)AS TOTALHORASPAG
    FROM HIS_MOV_HORA M
    INNER JOIN TBL_EMPLEADO E
    ON E.EMPL_COD = M.MOV_CODEMPLEADO AND E.EMPL_FECH_AF > 0 AND (M.MOV_FECHA>='22/10/2018' AND M.MOV_FECHA<='28/10/2018')  
    INNER JOIN TBL_SECCION S
    ON M.MOV_CODSECUENCIA=S.ID_CODIGO  
    --GROUP BY S.ID_CODIGO, S.CUENTA_CONTABLE_AF, S.SECCION,M.MOV_NHORA,M.MOV_VHORA
    ORDER BY S.SECCION ASC

INSERT INTO #TOTALHORAS(EMPLSECCION,EMPLMINUTOSN,EMPLVALORN)
SELECT  
    S.SECCION AS SECCION,   
    M.MOV_NHORA AS HORAS,   
    (M.MOV_VHORA)AS TOTALHORASPAG
    FROM HIS_MOV_HORA M
    INNER JOIN TBL_EMPLEADO E
    ON E.EMPL_COD = M.MOV_CODEMPLEADO AND E.EMPL_FECH_AF = 0 AND (M.MOV_FECHA>='22/10/2018' AND M.MOV_FECHA<='28/10/2018')
    INNER JOIN TBL_SECCION S
    ON M.MOV_CODSECUENCIA=S.ID_CODIGO
    ORDER BY S.SECCION ASC            

;WITH VISTA AS(
SELECT EMPLSECCION,
(SELECT ISNULL (CASE WHEN (EMPLMINUTOS>'0') THEN EMPLMINUTOS END,'00:00')) AS EMPLMINUTOS,
(SELECT ISNULL (CASE WHEN (EMPLVALORA>0) THEN EMPLVALORA END,0))AS EMPLVALORA,
(SELECT ISNULL (CASE WHEN (EMPLMINUTOSN>'0') THEN EMPLMINUTOSN END,'00:00'))AS EMPLMINUTOSN,
(SELECT ISNULL (CASE WHEN (EMPLVALORN>0) THEN EMPLVALORN END,0)) AS EMPLVALORN
FROM #TOTALHORAS)

SELECT DISTINCT EMPLSECCION,
CONVERT(VARCHAR(4),ISNULL((SUM((DATEPART(HOUR, EMPLMINUTOS) * 60) + DATEPART(MINUTE, EMPLMINUTOS)) / 60),0)) +':'+ CONVERT(VARCHAR(4),ISNULL(SUM((DATEPART(HOUR, EMPLMINUTOS) * 60) + DATEPART(MINUTE, EMPLMINUTOS)) % 60,0)) TOTALMIN, 
SUM (EMPLVALORA)AS EMPLVALORA,
CONVERT(VARCHAR(4),ISNULL((SUM((DATEPART(HOUR, EMPLMINUTOSN) * 60) + DATEPART(MINUTE, EMPLMINUTOSN)) / 60),0)) +':'+ CONVERT(VARCHAR(4),ISNULL(SUM((DATEPART(HOUR, EMPLMINUTOSN) * 60) + DATEPART(MINUTE, EMPLMINUTOSN)) % 60,0)) TOTALMINA,    
SUM(EMPLVALORN) AS EMPLVALORN FROM VISTA GROUP BY EMPLSECCION
ORDER BY EMPLSECCION

After several days of trying to come to the solution of the question and attached the final code to solve the issue.

    
answered by 22.11.2018 / 17:55
source
0

Your error is that you have not understood how the grouping works in SQL. Once you understand it, writing the query that generates the results you expect is trivial.

Change the last query to:

select   emplseccion
       , sum(emplminutos) as emplminutos
       , sum(emplvalora) as emplvalora
       , sum(empolminutosn) as empolminutosn
       , sum(emplvalorn) as emplvalorn
  from vista 
 group by emplseccion

I recommend you understand how this query works and compare it with your original query to deepen the understanding of this topic that is crucial for any SQL programmer.

    
answered by 17.11.2018 в 01:11