sexta-feira, 17 de abril de 2009

Pivoteando colunas no Sql Server

Ocasionalmente, para fins de relatório ou visualização, podemos precisar de uma visão invertida dos dados, colocando linhas como colunas. Principalmente em tabelas que envolvem dados temporais, como tabelas de vendas ou pedidos.

Segue abaixo um scrip devidamente comentado com um exemplo de inversão.

Primeiro vamos criar uma tabela chamada VENDAS:

create table vendas (data datetime, valor numeric(9,2))
GO


Vamos inserir alguns dados fictícios:
insert vendas values ('2009-04-17 15:25:54.090', 10)
insert vendas values ('2009-03-17 15:25:54.090', 20)
insert vendas values ('2009-02-17 15:25:54.090', 26.32)
insert vendas values ('2008-01-17 15:25:54.090', 32)
insert vendas values ('2008-12-17 15:25:54.090', 99)
insert vendas values ('2008-11-17 15:25:54.090', 54)
insert vendas values ('2008-11-17 15:25:54.090', 65.65)
insert vendas values ('2007-10-17 15:25:54.090', 98.65)
insert vendas values ('2007-09-17 15:25:54.090', 32.45)
insert vendas values ('2007-09-17 15:25:54.090', 98.65)
insert vendas values ('2006-04-17 15:25:54.090', 23.65)


Aqui realizamos o select, agrupando os dados por mês/ano e somando os valores:
select year(data) as ano
,mes_1 = sum(case when month(data)=1 then valor end)
,mes_2 = sum(case when month(data)=2 then valor end)
,mes_3 = sum(case when month(data)=3 then valor end)
,mes_4 = sum(case when month(data)=4 then valor end)
,mes_5 = sum(case when month(data)=5 then valor end)
,mes_6 = sum(case when month(data)=6 then valor end)
,mes_7 = sum(case when month(data)=7 then valor end)
,mes_8 = sum(case when month(data)=8 then valor end)
,mes_9 = sum(case when month(data)=9 then valor end)
,mes_10 = sum(case when month(data)=10 then valor end)
,mes_11 = sum(case when month(data)=11 then valor end)
,mes_12 = sum(case when month(data)=12 then valor end)

from vendas
group by year(data)
order by year(data)


Futuramente vamos exemplicar o uso do comando pivot, funcionalidade disponibilizada a partir do SQL Server 2005.

Nenhum comentário:

Postar um comentário

Leave your comment here!