Tema SQL
PIVOT (SQL Server)
Operador de tabla que rota valores de una columna en columnas nuevas con agregación. Sintaxis propietaria T-SQL; distinta de extensiones de otros motores.
Descripción
PIVOT (agg(col) FOR columna_pivot IN (lista_valores)) AS alias requiere subconsulta o CTE previa con columnas no pivotadas. Lista de columnas destino debe conocerse (dinámico requiere SQL dinámico). Para informes ad hoc CASE + GROUP BY es a veces más claro. PostgreSQL crosstab en tablefunc; MySQL solo CASE.
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.
SELECT …
FROM (subconsulta_base) AS src
PIVOT (SUM(importe) FOR mes IN ([1],[2],[3])) AS p;
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.
- Agregado
- PIVOT exige función de agregación aunque haya una fila por celda.
- Dinámico
- Columnas fijas en IN; para dinámico usa sp_executesql.
Ejemplos
Ejemplo 1
SELECT *
FROM (
SELECT anio, mes, ventas FROM fact_mensual
) s
PIVOT (SUM(ventas) FOR mes IN ([1],[2],[3],[4])) AS p;
Ejemplo 2
SELECT * FROM (VALUES (2025,1,10),(2025,2,20)) v(a,m,v)
PIVOT (MAX(v) FOR m IN ([1],[2])) p;
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.