Convertendo linhas em colunas no SQL Server usando PIVOT

Aprenda a transformar linhas de resultado em colunas!

Durante o trabalho de análise de dados, sempre se faz necessário converter os dados de modo a atender as necessidades de nossos usuários. Uma forma de conversão muito útil é fazer o agrupamento de dados exibidos em linha, para que cada elemento distinto da linha seja transformado numa coluna.

Veja os dados de exemplo abaixo:

Nosso objetivo é fazer a seguinte análise, criar uma coluna para cada departamento, de modo a mostrar o total gasto no mês de janeiro. 

Se fizermos um agrupamento por departamento, ordenando por nome do departamento vamos ter o seguinte resultado:

 

 

Para poder inverter esse tipo de análise, o SQL SERVER disponibiliza o comando PIVOT. O PIVOT trabalha da seguinte forma:

 

SELECT (colunas que eu quero utilizar da consulta de referência) FROM (consulta de referência que vai trazer os dados desejados) alias_desta_consulta PIVOT (Função de Agrupamento e nome das colunas que serão criadas pelo agrupamento)

 

Apesar da sintaxe parecer complexa num primeiro momento, na prática a consulta não tem segredos. Veja como fica a solução do exemplo proposto:

select * from (

select DEPARTAMENTO, VALOR 

FROM minha_tabela 

where month(data) = 1 and year(data) = 2017 

) DataTable 

PIVOT 

(

SUM(VALOR) 

FOR DEPARTAMENTO 

IN ([COMPRAS], [MKT]) 

) PivotTable 

No exemplo acima, fazemos uma consulta onde desejamos trabalhar com as colunas departamento e valor que atendam a condição de ser do mês de janeiro. Essa consulta é registrada com o alias "Datatable". Sobre este resultado, aplicamos uma função de agrupamento para a coluna "valor", a função escolhida foi a SUM, desta forma somamos todos os valores. O resultado da soma vai ser quebrado em novas colunas, o campo que vai servir de base será o campo departamento. 

Na tabela que mostra os dados que estamos trabalhos podemos ver que existem quatro departamentos. Vamos criar apenas duas colunas, uma para o departamento Compras, e outra para o departamento MKT.

O retorno deste PIVOT seria o seguinte:

Se você quiser saber a quantidade de compras ao invés do valor, basta fazer o seguinte ajuste:

 

select * from (

select DEPARTAMENTO, VALOR 

FROM minha_tabela 

where month(data) = 1 and year(data) = 2017 

) DataTable 

PIVOT 

(

COUNT (VALOR) 

FOR DEPARTAMENTO 

IN ([COMPRAS], [MKT]) 

) PivotTable 

 

E o resultado seria:

 

Quer conferir mais dicas sobre banco de dados? Clique aqui e veja mais dicas!