Tema SQL
PIVOT y UNPIVOT
Girar filas a columnas (PIVOT) o columnas a filas (UNPIVOT); muy usado en informes.
Descripción
PIVOT agrega y reparte valores en columnas nuevas según otra columna (p. ej. ventas por mes). UNPIVOT hace lo inverso. La sintaxis estándar completa es propia de SQL Server y Oracle; PostgreSQL suele usar CASE + agregación o extensiones; MySQL con workarrows.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
-- SQL Server (patrón conceptual)
SELECT *
FROM (SELECT anio, mes, importe FROM ventas) AS src
PIVOT (SUM(importe) FOR mes IN ([1],[2],[3])) AS p;
-- UNPIVOT: columnas anchas -> filas largas
SELECT producto, trimestre, cantidad
FROM datos
UNPIVOT (cantidad FOR trimestre IN (Q1, Q2, Q3, Q4)) AS u;
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- PIVOT
- Requiere agregado (SUM, MAX…) y lista de columnas pivote (literales o identificadores según motor).
- UNPIVOT
- Nombres de columnas origen pasan a valores en una columna “categoría”.
Ejemplos
Ejemplo 1
-- Equivalente portable: agregación condicional
SELECT anio,
SUM(CASE WHEN mes = 1 THEN importe END) AS m01,
SUM(CASE WHEN mes = 2 THEN importe END) AS m02
FROM ventas
GROUP BY anio;
Ejemplo 2
SELECT * FROM (VALUES (1,'a'),(2,'b')) v(x,y); -- base para pivot manual
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.