Ejemplo de UNPIVOT en SQL Server

Con este ejemplo de T-SQL, puedes transformar fácilmente columnas en filas con solo un paso gracias a la función UNPIVOT de SQL Server.

Es el opuesto exacto de la consulta PIVOT. En este ejemplo, solo se utilizan como columnas los seis primeros meses del año, es decir, de enero a junio. Sin embargo, puedes extender la consulta a los 12 períodos del año añadiendo los que faltan.

1. Crear datos para transformar en filas usando el operador UNPIVOT

Por ejemplo, la tabla de Ventas de SQL Server contiene una columna de tipo y las columnas de los meses. Contienen respectivamente el tipo y la cantidad de ventas por mes. Para empezar, solo copia y pega la consulta SQL para la creación de la tabla dentro de SSMS.

Primero que todo, crea la tabla de muestra usando este script, simplemente copia y pega el ejemplo en tu ventana de SQL Server Management Studio.

-- Primero que todo, ELIMINA la tabla de Ventas por mes si ya existe en la base de datos
IF EXISTS( 
	SELECT 1 FROM sys.objects
     WHERE object_id = object_id(N'[dbo].[SALES_BY_MONTH]')
		AND type in (N'U') )
-- BEGIN DROP TABLE [dbo].[SALES_BY_MONTH]
END;

-- Crea la tabla de VENTAS
CREATE table [dbo].[SALES_BY_MONTH] (
    [SalesType] NVARCHAR(20),
    [January] NUMERIC(5),
    [February] NUMERIC(5),
    [March] NUMERIC(5),
    [April] NUMERIC(5),
    [May] NUMERIC(5),
    [June] NUMERIC(5)
);

2. Insertar datos en la tabla fuente para transformar

A continuación, inserta los datos en la tabla a ser transpuesta. Cada inserción de datos en SQL añade 12 nuevas cantidades de ventas. Una columna por mes, con el tipo de venta asociado.

Añade los meses que faltan si es necesario. De esta manera podrás transformar los 12 meses del año de columnas a filas en una única consulta de SQL Server.

-- Inserta datos de ventas de muestra para cada mes: es decir, de enero a junio
-- Las columnas de los meses serán transformadas de columnas a filas
INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Ventas', 1000, 2000, 3000, 4000, 5000, 6000);

INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Descuentos', 100, 200, 300, 400, 500, 600);

INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Ofertas', 10, 20, 30, 40, 50, 60);

-- Verifica las filas insertadas en la tabla de ventas
SELECT * 
FROM   dbo.SALES_BY_MONTH;
Insertar datos para transformar de columnas a filas usando T-SQL UNPIVOT
Insertar datos para transformar de columnas a filas usando T-SQL UNPIVOT

3. Consulta UNPIVOT de SQL Server para transformar columnas en filas

Finalmente, la función UNPIVOT de SQL Server se compone de 3 pasos diferentes para transponer las columnas en filas.

  1. La selección de las 3 columnas de resultado, es decir, Tipo, Mes y Cantidad.
  2. Después la subconsulta SQL con la selección original de datos.
  3. La operación UNPIVOT propiamente dicha con los 6 meses nombrados explícitamente.
-- UNPIVOT de Columnas a Filas con Consulta SQL
SELECT [TYPE], Month, Amount
FROM (	
	SELECT [TYPE], [January], [February], [March], [April], [May], [June]
	FROM dbo.SALES_BY_MONTH 	) sbm
UNPIVOT
   (Amount FOR Month IN 
      ([January], [February], [March], [April], [May], [June])
)AS SalesUnPivot;
Ejemplo de consulta UNPIVOT de SQL Server en SSMS
Ejemplo de consulta UNPIVOT de SQL Server en SSMS

Sobre los operadores PIVOT y UNPIVOT de SQL Server

Además, si todavía tienes dificultades con este operador UNPIVOT de SQL Server y su sintaxis, simplemente copia y pega el ejemplo y repite los tres pasos adaptándolos a tu caso real. Empieza por renombrar las columnas para entender cómo funciona. En conclusión, para leer más detalles, la documentación oficial de Microsoft para la función unpivot está disponible. UNPIVOT es lo opuesto a la función PIVOT, aquí tienes otro breve tutorial para usar la función PIVOT de SQL Server.

Be the first to comment

Leave a Reply

Tu dirección de correo no será publicada.


*