none
Cambiar SÓLO algunas filas por columnas RRS feed

  • Pregunta

  • Hola,

    Tengo la siguiente tabla y me encuentro con el siguiente problema. (La tabla es sólo un ejemplo, la tabla verdadera tiene miles de registros pero siempre de la forma que voy a comentar)

    Como vemos las primeras tres columnas tienen los mismos datos en grupos de tres filas correspondientes a una factura. Por tanto, necesitaría crear una fila la cual tuviera dicho datos de factura y en la cual creara nuevas columnas para cada uno de los tres artículos de la misma.

    La tabla de partida es ésta:

    DECLARE @Ventas AS TABLE ( FechaFactura Date, FechaVencimiento Date, CodigoFactura integer, Idarticulo Integer, CantidadArticulo integer, PrecioArticulo integer, PlazoEntregArticulo integer ); INSERT INTO @Ventas VALUES('01/01/2016','01/05/2016',1,8,24.5,9,7), ('01/01/2016','01/05/2016',1,7,44.5,15,9), ('01/01/2016','01/05/2016',1,4,14,12,15), ('03/01/2016','15/05/2016',4,3,1.5,14,34), ('03/01/2016','15/05/2016',4,1,32.5,3,21), ('03/01/2016','15/05/2016',4,12,11.5,5,12), ('04/01/2016','20/05/2016',6,14,9.24,7,14), ('04/01/2016','20/05/2016',6,1,32.5,24,14), ('04/01/2016','20/05/2016',6,12,11.5,14,21)


    El objetivo es obtener lo siguiente:

    He buscado en el foro ejemplos similares pero sólo he encontrado formas para convertir todas las filas en columnas. En mi caso, como se observa se trata de pivotas solo algunas de las filas.

    ¿Alguna idea de qué podría probar?

    Muchas gracias

    Angel

    viernes, 3 de julio de 2020 7:21

Respuestas

  • Cierto, acabo de probarlo y obtenemos la tabla buscada.

    Toca analizar el código para entender exactamente cómo se logra.

    Muchas gracias.

    • Marcado como respuesta Angeleci viernes, 3 de julio de 2020 7:56
    viernes, 3 de julio de 2020 7:56
  • Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

    viernes, 3 de julio de 2020 20:14
    Moderador

Todas las respuestas

  • Hola Angeleci:

    Puedes hacerlo tal que:

    DECLARE @VENTAS AS TABLE
    						 (
    						 FechaFactura        Date
    					   , FechaVencimiento    Date
    					   , CodigoFactura       integer
    					   , Idarticulo          Integer
    					   , CantidadArticulo    integer
    					   , PrecioArticulo      integer
    					   , PlazoEntregArticulo integer
    						 );
    
    INSERT INTO @VENTAS
    VALUES
    	   ( '01/01/2016', '01/05/2016', 1, 8, 24.5, 9, 7 ),
    	   ( '01/01/2016', '01/05/2016', 1, 7, 44.5, 15, 9 ),
    	   ( '01/01/2016', '01/05/2016', 1, 4, 14, 12, 15 ),
    	   ( '03/01/2016', '15/05/2016', 4, 3, 1.5, 14, 34 ),
    	   ( '03/01/2016', '15/05/2016', 4, 1, 32.5, 3, 21 ),
    	   ( '03/01/2016', '15/05/2016', 4, 12, 11.5, 5, 12 ),
    	   ( '04/01/2016', '20/05/2016', 6, 14, 9.24, 7, 14 ),
    	   ( '04/01/2016', '20/05/2016', 6, 1, 32.5, 24, 14 ),
    	   ( '04/01/2016', '20/05/2016', 6, 12, 11.5, 14, 21 );
    
    With R
    	 as (select *
    			  , ROW_NUMBER() over(partition by codigoFactura
    				order by FechaFactura) as row
    				from @VENTAS)
    	 select R.FechaFactura
    		  , R.FechaVencimiento
    		  , R.CodigoFactura
    		  , R.Idarticulo
    		  , R.CantidadArticulo
    		  , R.PrecioArticulo
    		  , R.PlazoEntregArticulo
    		  , R2.Idarticulo AS IdArticulo2
    		  , R2.CantidadArticulo as CantidadArticulo2
    		  , R2.PrecioArticulo as PrecioArticulo2
    		  , R2.PlazoEntregArticulo as PlazoEntregArticulo2
    		  , R3.Idarticulo AS IdArticulo3
    		  , R3.CantidadArticulo as CantidadArticulo3
    		  , R3.PrecioArticulo as PrecioArticulo3
    		  , R3.PlazoEntregArticulo as PlazoEntregArticulo3
    			from R
    					  LEFT JOIN R as R2 on R.CodigoFactura = R2.CodigoFactura and R.row = R2.row - 1
    					  LEFT JOIN R as R3 on R.CodigoFactura = R3.CodigoFactura and R.row = R3.row - 2
    			Where R.row = 1;

    Numeras las filas del conjunto y haces un join contra si mismo, pero con la numeración aumentada.

    Row_number

    https://javifer2.wordpress.com/2019/11/11/row-number-numerar-filas/

    Tablas de expresión común

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    viernes, 3 de julio de 2020 7:53
  • Cierto, acabo de probarlo y obtenemos la tabla buscada.

    Toca analizar el código para entender exactamente cómo se logra.

    Muchas gracias.

    • Marcado como respuesta Angeleci viernes, 3 de julio de 2020 7:56
    viernes, 3 de julio de 2020 7:56
  • Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

    viernes, 3 de julio de 2020 20:14
    Moderador