none
Mostrar Tabla sin campos repetidos en sql server 2014 RRS feed

  • Pregunta

  • hola amigos saludos espero puedan ayudarme en esta consulta:

    Tengo la siguiente tabla:

    DECLARE @pedidos TABLE
    (
    Semana varchar(15),
    Empresa varchar(20),
    CentroCosto varchar(25),
    numeroPedido varchar(10),
    Articulo varchar(20),
    UndMedida varchar(4),
    Cantidad float


    );
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #45','UND','12')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #47','UND','8')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #82','UND','15')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO5','19050002','PERFIL MADERA #21','UND','5')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL NORTE','CAMPO7','19050003','PERFIL MADERA #04','UND','25')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO8','19050004','PERFIL MADERA #10','UND','50')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 11','EMPRESA DEL SUR','CAMPO3','19050005','TRIPODES','UND','5')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 11','EMPRESA DEL SUR','CAMPO3','19050005','ANGULOS','UND','10')


    SELECT * FROM @pedidos ORDER BY Semana,Empresa

    **** Si hago una consulta simple "SELECT * FROM @pedidos ORDER BY Semana,Empresa" muestra la tabla en formato tabular con datos repetidos en las cuatro primeras columnas.

    Lo que deseo conseguir es como este ejemplo que les muestro, no repetir los campos semana, empresa y centro de costo:

    Semana Empresa CentroCosto  numeroPedido  Articulo UndMedida  Cantidad
    SEM10 E DEL NORTE CAMPO7 19050003 MADERA #04 UND 25
            E DEL SUR CAMPO8 19050004 MADERA #10 UND 50
              CAMPO1 19050001 MOLDES #45 UND 12
                 19050001 MOLDES #47 UND 8
                19050001 MOLDES #82 UND 15
             CAMPO5 19050002 MADERA #21 UND 5
    SEM11 E DEL SUR CAMPO3 19050005 TRIPODES UND 5
                 19050005 ANGULOS UND 10


    **acortado los nombres de algunos campos para que se vea mejor la tabla
    Saludos,






    martes, 7 de mayo de 2019 15:55

Respuestas

  • Hola Francisco River:

    Sin quitar la razón a Hunchback, te voy a dar una trampa, para que puedas hacer eso, no obstante, es someter al motor sql a cosas para las que no es lo suyo y si la aplicas, deberías de revisar el ordenamiento, porque semana, empresa no es determinista, por tanto puede darte lugar a sorpresas inesperadas.

    DECLARE @pedidos TABLE
    (
    Semana varchar(15),
    Empresa varchar(20),
    CentroCosto varchar(25),
    numeroPedido varchar(10),
    Articulo varchar(20),
    UndMedida varchar(4),
    Cantidad float
    );
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #45','UND','12')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #47','UND','8')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #82','UND','15')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO5','19050002','PERFIL MADERA #21','UND','5')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL NORTE','CAMPO7','19050003','PERFIL MADERA #04','UND','25')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO8','19050004','PERFIL MADERA #10','UND','50')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 11','EMPRESA DEL SUR','CAMPO3','19050005','TRIPODES','UND','5')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 11','EMPRESA DEL SUR','CAMPO3','19050005','ANGULOS','UND','10')
    
    ;WITH cte
    	AS (SELECT semana
    		    , LAG(semana) OVER(
    			 ORDER BY semana
    				   , empresa
    				   ) AS semanasig
    		    , Empresa
    		    , LAG(Empresa) OVER(
    			 ORDER BY semana
    				   , empresa
    				   ) AS Empresasig
    		    , LAG(CentroCosto) OVER(
    		      ORDER BY semana
    				   , empresa
    				   ) AS centroCostoSig
    		    , CentroCosto
    		    , numeroPedido
    		    , Articulo
    		    , UndMedida
    		    , Cantidad
    	    FROM   
    		    @pedidos)
    	SELECT CASE WHEN c.semanasig IS NULL
    				 THEN semana 
    			  WHEN c.semanasig = c.semana
    				 THEN ''
    			  ELSE c.semana
    		  END AS semana
    	   , CASE WHEN c.Empresasig IS NULL or c.semanasig is null or c.semana<> c.semanasig
    				 THEN Empresa 
    			WHEN c.Empresasig = c.Empresa
    				 THEN ''
    			  ELSE c.Empresa
    		  END AS Empresa
    	   , CASE WHEN c.CentroCostosig IS NULL or c.semanasig is null or c.semana<> c.semanasig
    				 THEN CentroCosto 
    			WHEN c.CentroCostosig = c.CentroCosto
    				 THEN ''
    			  ELSE c.CentroCosto
    		  END AS CentroCosto
    		, numeroPedido
    		, Articulo
    		, UndMedida
    		, Cantidad
    	FROM   
    		cte c;

    Salida

    Lag

    https://javifer2.wordpress.com/2018/09/11/lag-y-lead-siguiente-y-anterior/

    OVER 

    https://docs.microsoft.com/es-es/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

    • Marcado como respuesta FranciscoRiver miércoles, 8 de mayo de 2019 4:20
    martes, 7 de mayo de 2019 20:25

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://social.msdn.microsoft.com/Forums/es-ES/87a76572-8c3b-4370-9d0a-88c5ca31d40e/campos-repetidos?forum=sqlserveres

    https://social.msdn.microsoft.com/Forums/es-ES/147f1675-43d2-454f-bdcb-ffcf66313b07/datos-repetidos-en-tabla-de-sql?forum=sqlserveres

    https://social.msdn.microsoft.com/Forums/es-ES/4faf247d-d91c-498c-86bb-ddd11132dd13/consulta-sql-campos-repetidos?forum=sqlserveres

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    martes, 7 de mayo de 2019 16:45
  • Te recomiendo uses una herramienta de reportes para li que deseas hacer. T-SQL es un lenguaje de consultas y no necesari es la herramienta adecuada para lo que deseas hacer con el resultado.

    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 7 de mayo de 2019 17:20
  • Hola Francisco River:

    Sin quitar la razón a Hunchback, te voy a dar una trampa, para que puedas hacer eso, no obstante, es someter al motor sql a cosas para las que no es lo suyo y si la aplicas, deberías de revisar el ordenamiento, porque semana, empresa no es determinista, por tanto puede darte lugar a sorpresas inesperadas.

    DECLARE @pedidos TABLE
    (
    Semana varchar(15),
    Empresa varchar(20),
    CentroCosto varchar(25),
    numeroPedido varchar(10),
    Articulo varchar(20),
    UndMedida varchar(4),
    Cantidad float
    );
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #45','UND','12')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #47','UND','8')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO1','19050001','MOLDES #82','UND','15')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO5','19050002','PERFIL MADERA #21','UND','5')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL NORTE','CAMPO7','19050003','PERFIL MADERA #04','UND','25')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 10','EMPRESA DEL SUR','CAMPO8','19050004','PERFIL MADERA #10','UND','50')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 11','EMPRESA DEL SUR','CAMPO3','19050005','TRIPODES','UND','5')
    INSERT INTO @pedidos (Semana,Empresa,CentroCosto,numeroPedido,Articulo,UndMedida,Cantidad) VALUES ('SEMANA 11','EMPRESA DEL SUR','CAMPO3','19050005','ANGULOS','UND','10')
    
    ;WITH cte
    	AS (SELECT semana
    		    , LAG(semana) OVER(
    			 ORDER BY semana
    				   , empresa
    				   ) AS semanasig
    		    , Empresa
    		    , LAG(Empresa) OVER(
    			 ORDER BY semana
    				   , empresa
    				   ) AS Empresasig
    		    , LAG(CentroCosto) OVER(
    		      ORDER BY semana
    				   , empresa
    				   ) AS centroCostoSig
    		    , CentroCosto
    		    , numeroPedido
    		    , Articulo
    		    , UndMedida
    		    , Cantidad
    	    FROM   
    		    @pedidos)
    	SELECT CASE WHEN c.semanasig IS NULL
    				 THEN semana 
    			  WHEN c.semanasig = c.semana
    				 THEN ''
    			  ELSE c.semana
    		  END AS semana
    	   , CASE WHEN c.Empresasig IS NULL or c.semanasig is null or c.semana<> c.semanasig
    				 THEN Empresa 
    			WHEN c.Empresasig = c.Empresa
    				 THEN ''
    			  ELSE c.Empresa
    		  END AS Empresa
    	   , CASE WHEN c.CentroCostosig IS NULL or c.semanasig is null or c.semana<> c.semanasig
    				 THEN CentroCosto 
    			WHEN c.CentroCostosig = c.CentroCosto
    				 THEN ''
    			  ELSE c.CentroCosto
    		  END AS CentroCosto
    		, numeroPedido
    		, Articulo
    		, UndMedida
    		, Cantidad
    	FROM   
    		cte c;

    Salida

    Lag

    https://javifer2.wordpress.com/2018/09/11/lag-y-lead-siguiente-y-anterior/

    OVER 

    https://docs.microsoft.com/es-es/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

    • Marcado como respuesta FranciscoRiver miércoles, 8 de mayo de 2019 4:20
    martes, 7 de mayo de 2019 20:25
  • Excelente, gracia tendré en cuenta las recomendaciones.

    Saludos

    miércoles, 8 de mayo de 2019 4:21