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

Como usar PIVOT no SQL Server: transformar linhas em colunas

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

Transformar linhas em colunas é uma das tarefas mais pedidas em relatórios: em vez de uma lista comprida de valores, queremos uma tabela de resumo com um valor por coluna. O operador PIVOT no SQL Server faz exatamente isso em T-SQL, sem precisar de exportar os dados para o Excel. É uma técnica muito útil em dashboards e relatórios mensais, onde cada período precisa da sua própria coluna. É, no fundo, o equivalente em SQL a uma tabela dinâmica do Excel.

Pré-requisitos

  • Uma instância de SQL Server (2012 ou superior) ou uma base de dados Azure SQL.
  • SQL Server Management Studio (SSMS) ou Azure Data Studio para correr as consultas.
  • Permissões para criar uma tabela numa base de dados de testes.
  • Noções básicas de SELECT e GROUP BY.

Passo 1: Preparar dados de exemplo

Primeiro criamos uma pequena tabela de vendas por região e trimestre. Assim consegues seguir o exemplo mesmo sem uma base de dados real à mão.

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);

Passo 2: Ver o problema (formato longo)

Uma consulta simples devolve uma linha por cada combinação de região e trimestre. Está correto, mas é difícil de ler como relatório.

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

São oito linhas no chamado formato longo. O objetivo é passar a ter uma linha por região e uma coluna por trimestre, para comparar valores de relance.

Passo 3: Aplicar PIVOT no SQL Server

O PIVOT precisa de três coisas: uma consulta de origem, uma função de agregação (aqui SUM) e a lista de valores que passam a colunas. Os nomes entre parênteses retos, como [Q1], são identificadores de coluna e têm de coincidir com os valores da coluna 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;

A função SUM(Valor) preenche cada célula da tabela; a cláusula FOR Trimestre IN (...) diz que valores da coluna Trimestre se tornam colunas. O resultado passa a ter apenas duas linhas, uma por região.

Repara em dois pormenores obrigatórios: a subconsulta de origem tem de ter um alias (aqui origem) e o resultado do PIVOT também (pivotado). Sem estes nomes, o SQL Server devolve um erro de sintaxe.

Passo 4: Tratar valores em falta e somar totais

Se uma região não tiver vendas num trimestre, a célula fica a NULL. Usa ISNULL para mostrar zero e aproveita para acrescentar uma coluna de total por região.

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 o resultado

Deves ver duas linhas, uma por região, com quatro colunas de trimestre e a coluna Total. Confirma as contas: o Norte soma 1000 + 1500 + 1200 + 1800 = 5500 e o Sul soma 900 + 1100 + 1300 + 1600 = 4900. Se os totais baterem certo, o PIVOT está a funcionar como esperado.

Dica: o PIVOT obriga a conhecer antecipadamente os valores que viram colunas. Quando essa lista muda (por exemplo, meses de anos diferentes), gera a consulta com SQL dinâmico.

Conclusão

Com poucas linhas transformaste uma lista longa numa tabela de resumo, diretamente no SQL Server e sem sair da base de dados. A partir daqui, experimenta trocar SUM por AVG ou COUNT, ou explora o operador UNPIVOT para fazer o caminho inverso. E se os trimestres fossem meses que mudam a cada ano, como gerarias as colunas automaticamente?