Oracle 11g - Pivot Table (De Linha para Coluna)

Pessoal,

Boa Tarde!

Na versão 11g do Oracle Database foi incluído um novo recurso na instrução SELECT que é o: PIVOT. Agora em um comando SQL(SELECT) podemos facilmente transformar: linhas, formatadas em: colunas. Antes do surgimento do Oracle Database 11 g, para realizar essa ação era necessário usar algum tipo de função para percorrer cada valor e escreve-los em colunas independentes.


1 - Como exemplo, criamos uma tabela TB_PIVOT, que armazenará como informações: Estado, Ano e Valor, e inserimos alguns dados:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 

SQL> create table tb_pivot (uf varchar2(2), ano number(4), valor number(10,2));

Table created

SQL> insert into tb_pivot values('SP',1999,20.50);

1 row inserted

SQL> insert into tb_pivot values('SP',1999,22.50);

1 row inserted

SQL> insert into tb_pivot values('SP',2000,11.30);

1 row inserted

SQL> insert into tb_pivot values('SP',2000,14.30);

1 row inserted

SQL> insert into tb_pivot values('SP',2010,5);

1 row inserted

SQL> insert into tb_pivot values('SP',2010,5);

1 row inserted

SQL> commit;

Commit complete 

2 - Como resultado da tabela obtemos os dados abaixo. Note, temos as informações linha a linha! Para o estado de SP, temos no ano de 1999 dois lançamentos:

SQL> select * from tb_pivot;

UF   ANO        VALOR
-- ----- ------------
SP  1999        20,50
SP  1999        22,50
SP  2000        11,30
SP  2000        14,30
SP  2010         5,00
SP  2010         5,00

6 rows selected

3 - Vamos agora transformar as linhas em colunas, utilizando o novo recurso: PIVOT.
Somamos a coluna VALOR e agrupamos estes valores por colunas nos seus respectivos anos. Perceba que os anos agora são apresentados na linha de cabeçalho!
Importante: Neste cenário que estamos utilizando como exemplo, se filtrarmos(IN) um ano que não exista informações lançadas, 2015 por exemplo, surgirá uma coluna para este ano, porém sem informações, nula, como abaixo:

SQL> select * from tb_pivot
2   PIVOT(sum(valor) for ano in (1999,2000,2010,2015));

UF       1999       2000       2010       2015
-- ---------- ---------- ---------- ----------
SP         43       25,6         10 

SQL>

Abraço,

Ronaldo

Nenhum comentário:

Postar um comentário