Explicación de la Función Pivot en SQL Server
Aunque ya habíamos realizado un post donde hablamos de la función Pivot como herramienta para crear tablas de referencias cruzadas, esta vez hemos creado e incluido un video con la explicación del tema.
Las instrucciones PIVOT y UNPIVOT en SQL Server se utilizan para transformar datos en una tabla, facilitando su análisis y visualización. Aquí te explico cada una en detalle.
Instrucción PIVOT
PIVOT transforma datos de un formato de filas a un formato de columnas, esencialmente rotando una tabla. Esto es útil cuando deseas resumir datos y verlos en un formato de tabla cruzada.
Ejemplo de PIVOT
Supongamos que tienes una tabla de ventas con las siguientes columnas: Vendedor
, Producto
y CantidadVendida
.
CREATE TABLE Ventas (
Vendedor NVARCHAR(50),
Producto NVARCHAR(50),
CantidadVendida INT
);
INSERT INTO Ventas (Vendedor, Producto, CantidadVendida) VALUES
(‘Ana’, ‘Producto1’, 5),
(‘Ana’, ‘Producto2’, 3),
(‘Luis’, ‘Producto1’, 7),
(‘Luis’, ‘Producto3’, 6),
(‘Marta’, ‘Producto2’, 4),
(‘Marta’, ‘Producto3’, 8);
Queremos ver las ventas por producto para cada vendedor, con los productos como columnas:
SELECT Vendedor, Producto1, Producto2, Producto3
FROM (
SELECT Vendedor, Producto, CantidadVendida
FROM Ventas
) AS SourceTable
PIVOT (
SUM(CantidadVendida)
FOR Producto IN (Producto1, Producto2, Producto3)
) AS PivotTable;
Explicación:
- Subconsulta: Selecciona los datos originales.
- PIVOT: Suma (
SUM
) laCantidadVendida
y rota las filas, creando nuevas columnas para cada valor único enProducto
.
El resultado será:
Vendedor | Producto1 | Producto2 | Producto3 |
---|---|---|---|
Ana | 5 | 3 | NULL |
Luis | 7 | NULL | 6 |
Marta | NULL | 4 | 8 |
Instrucción UNPIVOT
UNPIVOT realiza la operación inversa de PIVOT, transformando datos de un formato de columnas a un formato de filas. Esto es útil cuando necesitas normalizar datos previamente pivotados.
Ejemplo de UNPIVOT
Supongamos que tienes la tabla pivotada anterior y quieres convertirla de nuevo a su forma original:
CREATE TABLE VentasPivot (
Vendedor NVARCHAR(50),
Producto1 INT,
Producto2 INT,
Producto3 INT
);
INSERT INTO VentasPivot (Vendedor, Producto1, Producto2, Producto3) VALUES
(‘Ana’, 5, 3, NULL),
(‘Luis’, 7, NULL, 6),
(‘Marta’, NULL, 4, 8);
Usamos UNPIVOT para transformar las columnas de productos de nuevo a filas:
SELECT Vendedor, Producto, CantidadVendida
FROM (
SELECT Vendedor, Producto1, Producto2, Producto3
FROM VentasPivot
) AS PivotTable
UNPIVOT (
CantidadVendida FOR Producto IN (Producto1, Producto2, Producto3)
) AS UnpivotTable;
Explicación:
- Subconsulta: Selecciona los datos pivotados.
- UNPIVOT: Transforma las columnas de productos (
Producto1
,Producto2
,Producto3
) en filas, conCantidadVendida
asignado a cada producto correspondiente.
El resultado será similar a la tabla original:
Vendedor | Producto | CantidadVendida |
---|---|---|
Ana | Producto1 | 5 |
Ana | Producto2 | 3 |
Luis | Producto1 | 7 |
Luis | Producto3 | 6 |
Marta | Producto2 | 4 |
Marta | Producto3 | 8 |
Comparación y Uso de PIVOT y UNPIVOT
- PIVOT es útil para convertir filas en columnas, facilitando la agregación y el resumen de datos en una vista de tabla cruzada.
- UNPIVOT es útil para normalizar datos, convirtiendo columnas en filas y permitiendo un análisis más detallado o diferentes tipos de agregaciones.