segunda-feira, 11 de abril de 2011

PIVOT

Olá a todos,

Depois de um longo e tenebroso inverno, voltei a atualizar o blog. E nessa reestreia achei interessante citar sobre um tema bem interessante.

PIVOT TABLE !!!

Participando de alguns fóruns e discussões verifiquei que muitas pessoas, inclusive eu mesmo, tinha dúvidas sobre o tema.

Vamos começar de forma conceitual. O que é PIVOT TABLE?

De forma simples e rápida o pivot é uma forma que o SQL Server disponibiliza para transformarmos linhas em colunas nas nossas consultas.

Muito usado para quem trabalha com BI, é um recurso que possibilita fazer uma visualização em colunas das linhas do resultado da consulta facilitando a analise das informações.

Segue um exemplo:

Create table #Exemplo (codigo int, nome varchar(10))


insert into #Exemplo (codigo, nome) Values (1,'jose')
insert into #Exemplo (codigo, nome) Values (2,'mario')
insert into #Exemplo (codigo, nome) Values (1,'jose')
insert into #Exemplo (codigo, nome) Values (2,'mario')
insert into #Exemplo (codigo, nome) Values (3,'celso')
insert into #Exemplo (codigo, nome) Values (4,'andre')


Select [jose],[mario],[celso],[andre] from #exemplo
Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p

O resultado trará:

Jose = 2
Mario = 2
Celso = 1
Andre = 1

Que é a quantidade de cada nome na tabela.

Observações:

- Se usado em versões do SQL 2005 ou superior, o nivel de compatibilidade deverá ser no minimo o 90.
- Valores nulos não são computados.

Para SQL 2000 a sintaxe já muda, segue um exemplo:

create table venda (ano int, mes int, valor numeric(9,2))


insert venda values (2003, 2, 10)
insert venda values (2003, 2, 1)
insert venda values (2003, 3, 20)
insert venda values (2003, 4, 30)
insert venda values (2004, 1, 40)
insert venda values (2004, 2, 50)
insert venda values (2004, 3, 60)
insert venda values (2004, 4, 70)
insert venda values (2005, 1, 80)


select * from venda order by 1,2,3


Para fazer um Pivot Table na versão 2000 é necessário você utilizar função de grupo e a cláusula group by.

select ano
, mes_1 = sum(case when mes=1 then valor end)
, mes_2 = sum(case when mes=2 then valor end)
, mes_3 = sum(case when mes=3 then valor end)
, mes_4 = sum(case when mes=4 then valor end)

from tb_venda
group by ano
order by ano;


Então é isso...

Até o próximo post.

Abraço.