
Invertendo linhas e colunas em um exemplo real.
Imagine que em um dia você se depara com a seguinte situação: precisa transformar as linhas do seu SELECT em colunas. A reação comum pode ser “vou fazer pelo meu software”, usando Delphi, .NET, Java, etc. Porém, processamentos desse porte geram alto consumo de recursos, deixando seu aplicativo lento. O ideal é que esse tipo de processamento fique a cargo do servidor ou do banco de dados.
Para essa situação, existe um operador muito interessante e até pouco conhecido por muitos: o PIVOT.
O que é o PIVOT?
O operador PIVOT no SQL Server gera uma expressão que transforma valores em tabela, ou seja, ele pega dados que estão em formato horizontal (linhas) e os converte em formato vertical (colunas).
Exemplo de dados em formato horizontal (linhas):
CodProduto | Descrição | Tamanho | QTD_ESTOQUE
- AA3705322 | BLUSA BASICA | P | 28
- AA3705322 | BLUSA BASICA | M | 33
- AA3705322 | BLUSA BASICA | G | 33
- AA3705322 | BLUSA BASICA | GG | 27
- AA3705322 | BLUSA BASICA | UN | 23
Exemplo após aplicar o PIVOT (linhas transformadas em colunas):
CodProduto | Descrição | P | M | G | GG | UN
AA3705322 | BLUSA BASICA | 28 | 33 | 33 | 27 | 23
Qual a sintaxe do PIVOT?
A sintaxe pode parecer complexa, mas é simples e prática. Aqui está a estrutura básica para uso do PIVOT:
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
[last pivoted column] AS <column name>
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;
Como aplicar em um SELECT comum?
Este é o uso mais comum do PIVOT, quando você conhece exatamente as colunas desejadas, como em um relatório anual de vendas.
Exemplo tradicional (sem pivot):
| ANO | MÊS | VALOR |
|---|---|---|
| 2013 | 1 | R$ 785.694,00 |
| 2013 | 2 | R$ 46.582,00 |
| 2013 | 3 | R$ 216.594,00 |
| 2013 | 4 | R$ 56.223,00 |
| 2013 | 5 | R$ 112.546,00 |
| 2013 | 6 | R$ 1.202.355,00 |
| 2013 | 7 | R$ 120.036,00 |
| 2013 | 8 | R$ 804.665,00 |
| 2013 | 9 | R$ 601.128,00 |
| 2013 | 10 | R$ 9.564.122,00 |
| 2013 | 11 | R$ 900.064,00 |
| 2013 | 12 | R$ 487.562,00 |
Agora, usando o PIVOT, teríamos a transformação dos meses em colunas, gerando um relatório mais compacto e legível:
| Ano | Janeiro | Fevereiro | Março | Abril | ... |
|---|---|---|---|---|---|
| 2013 | R$ 785.694,00 | R$ 46.582,00 | R$ 216.594,00 | R$ 56.223,00 | ... |
Listagem 2: PIVOT em colunas fixas
SELECT ANO
, [1] AS JANEIRO
, [2] AS FEVEREIRO
, [3] AS MARÇO
, [4] AS ABRIL
, [5] AS MAIO
, [6] AS JUNHO
, [7] AS JULHO
, [8] AS AGOSTO
, [9] AS SETEMBRO
, [10] AS OUTUBRO
, [11] AS NOVEMBRO
, [12] AS DEZEMBRO
FROM VENDAANUAIS
PIVOT (
SUM(VALOR)
FOR MES IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) P
ORDER BY 1;
Na consulta acima, usamos um SELECT normal e definimos apelidos para as colunas (ex: 1 = JANEIRO). Em seguida, aplicamos o operador PIVOT com função de agregação SUM para agrupar os valores por mês, finalizando com o ORDER BY.
Como aplicar em um SELECT dinâmico?
Essa é a parte mais interessante. Quando você não sabe previamente o número de colunas que o SELECT irá gerar, é necessário montar o PIVOT de forma dinâmica.
Veja a modelagem do banco de dados usada no exemplo:

Figura 1: Modelagem das tabelas
Com base neste modelo, vamos detalhar o SELECT com PIVOT dinâmico para facilitar o entendimento.
Listagem 3: Preparando o SCRIPT
DECLARE @SQLStr VARCHAR(5000);
SET @SQLStr = '';
SELECT @SQLStr = @SQLStr + ',[' + RTRIM(MES) + ']'
FROM
(SELECT DISTINCT MES FROM VENDAANUAIS) AS X
ORDER BY 1;
SET @SQLStr = 'SELECT ANO' + @SQLStr + '
FROM VENDAANUAIS
PIVOT (SUM(VALOR) FOR MES IN (' + STUFF(@SQLStr, 1, 1, '') + ')) AS P
ORDER BY 1;';
EXEC(@SQLStr);
Neste exemplo, o script cria dinamicamente a lista de colunas a partir dos meses existentes na tabela VENDAANUAIS. Depois, monta o comando SQL completo com PIVOT e executa.
Obs.: Usar o PIVOT dinâmico é uma ótima prática para relatórios que precisam lidar com colunas variáveis.
Conclusão
O operador PIVOT do SQL Server é uma ferramenta poderosa para transformar dados em tabelas mais legíveis e organizadas. Dominar seu uso, tanto em colunas fixas quanto dinâmicas, melhora a performance dos seus relatórios e simplifica consultas complexas.
Gostou do conteúdo? Deixe um comentário e compartilhe!

Comentários
Comente só assim vamos crescer juntos!