Formulário de contato

Nome

E-mail *

Mensagem *

Imagem

Como usar o operador PIVOT no SQL Server para transformar linhas em colunas

Como usar o operador PIVOT no SQL Server para transformar linhas em colunas

Publicado por em

@CanalQb

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

ANOMÊSVALOR
20131R$ 785.694,00
20132R$ 46.582,00
20133R$ 216.594,00
20134R$ 56.223,00
20135R$ 112.546,00
20136R$ 1.202.355,00
20137R$ 120.036,00
20138R$ 804.665,00
20139R$ 601.128,00
201310R$ 9.564.122,00
201311R$ 900.064,00
201312R$ 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:

Modelagem das tabelas

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!

Marcadores: Banco de Dados Blogger IA Script Sistemas Tutorial

© fevereiro 15, 2020 CanalQb — Python, Scripts, Automação, Airdrops e Criptomoedas | Web3 e Tech na Prática

Comentários