none
Eliminar datos duplicados en query Sql RRS feed

  • Pregunta

  • Buenos dias.

    Tengo un pequeño problemita con un query en el cual obtengo los datos de 2 tablas y al momento de realizar el select para mostrar los datos finales , existen datos duplicados

    ALTER procedure [dbo].[DiasLaborDiario]
    @FECHAL VARCHAR(10),
    @FECHAMA VARCHAR(10),
    @FECHAMI VARCHAR(10),
    @FECHAJU VARCHAR(10),
    @FECHAVI VARCHAR(10),
    @FECHASA VARCHAR(10),
    @FECHADO VARCHAR(10)
    AS
    IF OBJECT_ID('TEMPDB..#ROLESMEN') IS NOT NULL
    BEGIN
    	DROP TABLE #ROLESMEN;
    END 
    SET LANGUAGE SPANISH; 
    CREATE TABLE #ROLESMEN (
    EMPLCOD INT,
    OBRERO VARCHAR(100),
    SECCION VARCHAR(50),
    FECHA VARCHAR(50),
    LUNES VARCHAR(50),
    MARTES VARCHAR(50),
    MIERCOLES VARCHAR(50),
    JUEVES VARCHAR(50),
    VIERNES VARCHAR(50),
    SABADO VARCHAR(50),
    DOMINGO VARCHAR(50));
           
    INSERT INTO #ROLESMEN(EMPLCOD,OBRERO,SECCION,FECHA,LUNES,MARTES,MIERCOLES,JUEVES,VIERNES,SABADO,DOMINGO) 
            SELECT DISTINCT E.EMPL_COD AS COD,
            MAX(E.OBRERO) AS OBRERO,
            S.SECCION AS SECCION,
            E.EMPL_FEC AS EMPL_FEC,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_PROD WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAL))  AS LUNES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_PROD WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAMA)) AS MARTES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_PROD WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAMI)) AS MIERCOLES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_PROD WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAJU)) AS JUEVES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_PROD WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAVI)) AS VIERNES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_PROD WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHASA)) AS SABAD0,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_PROD WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHADO)) AS DOMINGO     
    		FROM HIS_MOV_PROD MH INNER JOIN 
    		(SELECT E.EMPL_COD,E.EMPL_CEDU,E.EMPL_AREA,MAX(ISNULL(E.EMPL_APELL,'')) + SPACE(1) + MAX(ISNULL(E.EMPL_NOMB,'')) AS OBRERO,
    		E.EMPL_FECH_AF AS EMPL_FEC
    		FROM TBL_EMPLEADO E 
    		GROUP BY E.EMPL_COD,E.EMPL_CEDU,E.EMPL_AREA, E.EMPL_FECH_AF) 
    		E ON E.EMPL_COD = MH.Mov_CodEmpleado AND (MH.Mov_Fecha=@FECHAL) OR (MH.Mov_Fecha=@FECHAMA) OR (MH.Mov_Fecha=@FECHAMI) 
    		OR (MH.Mov_Fecha=@FECHAJU) OR (MH.Mov_Fecha=@FECHAVI) OR (MH.Mov_Fecha=@FECHASA) OR (MH.Mov_Fecha=@FECHADO) INNER JOIN 
    		TBL_SECCION S ON  MH.Mov_CodEmpleado = E.EMPL_COD AND E.EMPL_FEC =0 AND E.EMPL_AREA = S.ID_CODIGO GROUP BY E.EMPL_COD,S.SECCION, E.EMPL_FEC ORDER BY OBRERO
    		
    INSERT INTO #ROLESMEN(EMPLCOD,OBRERO,SECCION,FECHA,LUNES,MARTES,MIERCOLES,JUEVES,VIERNES,SABADO,DOMINGO) 
            SELECT DISTINCT E.EMPL_COD AS COD,
            MAX(E.OBRERO) AS OBRERO,
            S.SECCION AS SECCION,
            E.EMPL_FEC AS EMPL_FEC,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_HORA WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAL)) AS LUNES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_HORA WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAMA)) AS MARTES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_HORA WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAMI)) AS MIERCOLES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_HORA WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAJU)) AS JUEVES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_HORA WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHAVI)) AS VIERNES,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_HORA WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHASA)) AS SABAD0,
            (SELECT DISTINCT Mov_Fecha FROM HIS_MOV_HORA WHERE MOV_CODEMPLEADO=E.EMPL_COD AND (MOV_FECHA=@FECHADO)) AS DOMINGO     
    		FROM HIS_MOV_HORA MH INNER JOIN 
    		(SELECT E.EMPL_COD,E.EMPL_CEDU,E.EMPL_AREA,MAX(ISNULL(E.EMPL_APELL,'')) + SPACE(1) + MAX(ISNULL(E.EMPL_NOMB,'')) AS OBRERO,
    		E.EMPL_FECH_AF AS EMPL_FEC
    		FROM TBL_EMPLEADO E 
    		GROUP BY E.EMPL_COD,E.EMPL_CEDU,E.EMPL_AREA, E.EMPL_FECH_AF) 
    		E ON E.EMPL_COD = MH.Mov_CodEmpleado AND (MH.Mov_Fecha=@FECHAL) OR (MH.Mov_Fecha=@FECHAMA) OR (MH.Mov_Fecha=@FECHAMI) 
    		OR (MH.Mov_Fecha=@FECHAJU) OR (MH.Mov_Fecha=@FECHAVI) OR (MH.Mov_Fecha=@FECHASA) OR (MH.Mov_Fecha=@FECHADO) INNER JOIN 
    		TBL_SECCION S ON  MH.Mov_CodEmpleado = E.EMPL_COD AND E.EMPL_FEC =0 AND E.EMPL_AREA = S.ID_CODIGO GROUP BY E.EMPL_COD,S.SECCION, E.EMPL_FEC ORDER BY OBRERO		
    
    		
     SELECT  DISTINCT EMPLCOD AS COD,		
    		(SELECT DISTINCT OBRERO )AS OBRERO,		
    		(SELECT DISTINCT SECCION) AS SECCION,
    		FECHA AS FECHA
     ,(SELECT DISTINCT ISNULL(CASE WHEN (LUNES != '0') THEN '1' END ,0)) AS LUNES
     ,(SELECT DISTINCT ISNULL(CASE WHEN (MARTES != '0') THEN '1' END ,0)) AS MARTES
     ,(SELECT DISTINCT ISNULL(CASE WHEN (MIERCOLES != '0') THEN '1' END ,0)) AS MIERCOLES
     ,(SELECT DISTINCT ISNULL(CASE WHEN (JUEVES != '0') THEN '1' END ,0)) AS JUEVES
     ,(SELECT DISTINCT ISNULL(CASE WHEN (VIERNES != '0') THEN '1' END ,0)) AS VIERNES
     ,(SELECT DISTINCT ISNULL(CASE WHEN (SABADO != '0') THEN '1' END ,0)) AS SABADO
     ,(SELECT DISTINCT ISNULL(CASE WHEN (DOMINGO != '0') THEN '1' END ,0)) AS DOMINGO
    FROM #ROLESMEN ORDER BY OBRERO
    
    

    Como se ve en la imagen se repiten los datos el dia lunes y viernes debido a que laboro en las 2 areas, que cambio puedo realizar para que los datos me salgan en una sola fila y eliminar la duplicidad.

    De antemano agradezco su ayuda y sus comentarios

    Saludos Cordiales.

    miércoles, 19 de octubre de 2016 16:55

Respuestas

  • Roberto, si he entendido bien el problema después de leer todas las preguntas y respuestas hasta ahora, el problema lo tienes en que haces el group by por unos valores, pero luego no los muestras todos, tienes dos alternativas, o bien muestras la sección, con lo que se verá que no es distinto o bien , no la metes como parte de group by, con lo cual te agregará en lunes 1+1 y te saldrá 2  o bien, vuelves a hacer ese group by en la ultima parte de tu sp, contra la tabla temporal.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 19 de octubre de 2016 22:56
    Moderador

Todas las respuestas

  • Primero si trabajó en dos areas, como vas a presentarlo en una sola fila piensas descartar una de las areas y en segundo caso piensas totalizar presentado un 2 en esos dias o solo 1
    miércoles, 19 de octubre de 2016 17:23
  • Primero si trabajó en dos areas, como vas a presentarlo en una sola fila piensas descartar una de las areas y en segundo caso piensas totalizar presentado un 2 en esos dias o solo 1

    La idea es que cuando la persona en cuestion trabaje en las 2 areas el mismo dia , solo se presente 1 registro.

    Saludos.

    miércoles, 19 de octubre de 2016 17:43
  • Estimado pero cual es tu criterio para borrar , el dia martes aparece 0 y 1  , cual eliminar'?

    Saludos

    miércoles, 19 de octubre de 2016 17:51
  • Estimado pero cual es tu criterio para borrar , el dia martes aparece 0 y 1  , cual eliminar'?

    Saludos

    El criterio es que si laboro 2 veces en cada area, solo aparezca una y asi evite el presentar otra fila con el mismo nombre , que todo aparezca en una sola.
    miércoles, 19 de octubre de 2016 17:58
  • Trata de usar el CASE WHEN    cuando el sum(dia Lunes) por ejemplo es mayo a 0 pones then 1 y asi vas creando el regristro unico
    miércoles, 19 de octubre de 2016 18:04
  • Estimado hacer una consulta con Lunes , Martes , etc, no muy bueno para su mantenimiento , si podrias mostrar la tabla de esta forma : 

    Cod  Empleado    Dia

    1     Jorge Lunes

    1 Jorge Mar tes

    1 Jorge  Lunes

    Y luego hacer un Group By , luego de esto pivotear la Tabla o desde el mismo reporte jugar con esto para que te muestre el resultado tal como quieres

    .

    Igual estamos para apoyarte

    miércoles, 19 de octubre de 2016 20:01
  • Roberto, si he entendido bien el problema después de leer todas las preguntas y respuestas hasta ahora, el problema lo tienes en que haces el group by por unos valores, pero luego no los muestras todos, tienes dos alternativas, o bien muestras la sección, con lo que se verá que no es distinto o bien , no la metes como parte de group by, con lo cual te agregará en lunes 1+1 y te saldrá 2  o bien, vuelves a hacer ese group by en la ultima parte de tu sp, contra la tabla temporal.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 19 de octubre de 2016 22:56
    Moderador