(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo usar PIVOT en SQL Server: convertir filas en columnas

João Barros 08 de July de 2026 4 min de lectura

Convertir filas en columnas es una de las tareas más solicitadas en los informes: en lugar de una lista larga de valores, queremos una tabla de resumen con un valor por columna. El operador PIVOT en SQL Server hace exactamente eso en T-SQL, sin exportar los datos a Excel. Es muy útil para dashboards e informes mensuales, donde cada periodo necesita su propia columna. En el fondo, es el equivalente en SQL a una tabla dinámica de Excel.

Requisitos previos

  • Una instancia de SQL Server (2012 o superior) o una base de datos Azure SQL.
  • SQL Server Management Studio (SSMS) o Azure Data Studio para ejecutar las consultas.
  • Permisos para crear una tabla en una base de datos de pruebas.
  • Nociones básicas de SELECT y GROUP BY.

Paso 1: Preparar datos de ejemplo

Primero creamos una pequeña tabla de ventas por región y trimestre. Así podrás seguir el ejemplo incluso sin una base de datos real a mano.

CREATE TABLE Vendas (
    Regiao    VARCHAR(20),
    Trimestre VARCHAR(2),
    Valor     DECIMAL(10,2)
);

INSERT INTO Vendas (Regiao, Trimestre, Valor) VALUES
('Norte', 'Q1', 1000), ('Norte', 'Q2', 1500),
('Norte', 'Q3', 1200), ('Norte', 'Q4', 1800),
('Sul',   'Q1',  900), ('Sul',   'Q2', 1100),
('Sul',   'Q3', 1300), ('Sul',   'Q4', 1600);

Paso 2: Ver el problema (formato largo)

Una consulta simple devuelve una fila por cada combinación de región y trimestre. Es correcto, pero difícil de leer como informe.

SELECT Regiao, Trimestre, Valor
FROM Vendas
ORDER BY Regiao, Trimestre;

Son ocho filas en el llamado formato largo. El objetivo es tener una fila por región y una columna por trimestre, para comparar valores de un vistazo.

Paso 3: Aplicar PIVOT en SQL Server

El operador PIVOT necesita tres cosas: una consulta de origen, una función de agregación (aquí SUM) y la lista de valores que se convierten en columnas. Los nombres entre corchetes, como [Q1], son identificadores de columna y deben coincidir con los valores de la columna Trimestre.

SELECT Regiao, [Q1], [Q2], [Q3], [Q4]
FROM (
    SELECT Regiao, Trimestre, Valor
    FROM Vendas
) AS origem
PIVOT (
    SUM(Valor)
    FOR Trimestre IN ([Q1], [Q2], [Q3], [Q4])
) AS pivotado
ORDER BY Regiao;

La función SUM(Valor) rellena cada celda de la tabla; la cláusula FOR Trimestre IN (...) indica qué valores de la columna Trimestre se convierten en columnas. El resultado pasa a tener solo dos filas, una por región.

Fíjate en dos detalles obligatorios: la subconsulta de origen debe tener un alias (aquí origem) y el resultado del PIVOT también (pivotado). Sin estos nombres, SQL Server devuelve un error de sintaxis.

Paso 4: Tratar valores faltantes y sumar totales

Si una región no tiene ventas en un trimestre, la celda queda en NULL. Usa ISNULL para mostrar cero y aprovecha para añadir una columna de total por región.

SELECT
    Regiao,
    ISNULL([Q1], 0) AS Q1,
    ISNULL([Q2], 0) AS Q2,
    ISNULL([Q3], 0) AS Q3,
    ISNULL([Q4], 0) AS Q4,
    ISNULL([Q1],0) + ISNULL([Q2],0) + ISNULL([Q3],0) + ISNULL([Q4],0) AS Total
FROM (
    SELECT Regiao, Trimestre, Valor
    FROM Vendas
) AS origem
PIVOT (
    SUM(Valor)
    FOR Trimestre IN ([Q1], [Q2], [Q3], [Q4])
) AS pivotado
ORDER BY Regiao;

Verificar el resultado

Deberías ver dos filas, una por región, con cuatro columnas de trimestre y la columna Total. Comprueba las cuentas: Norte suma 1000 + 1500 + 1200 + 1800 = 5500 y Sul suma 900 + 1100 + 1300 + 1600 = 4900. Si los totales cuadran, PIVOT está funcionando como se espera.

Consejo: PIVOT obliga a conocer de antemano los valores que se convierten en columnas. Cuando esa lista cambia (por ejemplo, meses de años diferentes), genera la consulta con SQL dinámico.

Conclusión

Con pocas líneas has convertido una lista larga en una tabla de resumen, directamente en SQL Server y sin salir de la base de datos. A partir de aquí, prueba a cambiar SUM por AVG o COUNT, o explora el operador UNPIVOT para hacer el camino inverso. Y si los trimestres fueran meses que cambian cada año, ¿cómo generarías las columnas automáticamente?