ORACLE PL/SQL – Transformando Colunas em Linhas – UNPIVOT

Olá a todos!

Hoje mostro um pequeno tutorial de como transformar Colunas em Linhas em uma query no PL/SQL utilizando UNPIVOT.

O Processo é simples:

Digamos que você possui, por algum motivo, uma tabela TB_FALTAS assim:

CPFDIA_01DIA_02DIA_03DIA_04DIA_…
123.123.132-75FPPF
444.444.546-75PPFp

E queira transformar em:

CPFDIAP_OU_F
123.123.132-75DIA_01F
123.123.132-75DIA_02P
123.123.132-75DIA_03P
123.123.132-75DIA_04F
123.123.132-75
444.444.546-75DIA_01P
444.444.546-75DIA_02P
444.444.546-75DIA_03F
444.444.546-75DIA_04P
444.444.546-75

Veja aqui como fazer:

A query seria assim:

SELECT CPF, DIA, P_OU_F
  FROM VALE.TB_VALE_TESTE UNPIVOT(P_OU_F FOR DIA IN(
                                                    DIA_01,
                                                    DIA_02,
                                                    DIA_03,
                                                    DIA_04,
                                                    DIA_05))

Onde:
P_OU_F será a coluna com as informações de presença ou falta de cada dia, onde inicialmente eram as Linhas; e
DIA, será a linha dos dias, onde inicialmente eram as colunas.

Lembrando que você pode usar um ALIAS em cada ‘linha dos dias’, como no exemplo abaixo:

SELECT CPF, DIA, P_OU_F
  FROM VALE.TB_VALE_TESTE UNPIVOT(P_OU_F FOR DIA IN(
                                                    DIA_01 AS '01',
                                                    DIA_02 AS '02',
                                                    DIA_03 AS '03',
                                                    DIA_04 AS '04',
                                                    DIA_05 AS '05'))

Mas NÃO É POSSÍVEL usar um ALIAS com alguma coluna do resultado. Caso no exemplo tivéssemos uma coluna com mês e formar o alias assim:

    DIA_01 AS '01/' || MES || '/2014',
    DIA_02 AS '02/' || MES || '/2014',
    DIA_03 AS '03/' || MES || '/2014',
    DIA_04 AS '04/' || MES || '/2014',
    DIA_05 AS '05/' || MES || '/2014'

Não funciona, o Oracle retorna esse erro:
ORA-56901: a expressão não constante não é permitida para os valores pivot|unpivot

É isso ai pessoal!
Abraços!

Referências:

5.00 avg. rating (97% score) - 2 votes

Autor: Reynaldo

Desenvolvedor a mais de três anos de diversas plataformas como .Net/Java e Android. Muito autodidata e empenhado, gosta de descobrir coisas novas e conhecer as novas ferramentas do mercado. Vive pensando sobre a vida e tendo ideias de como melhorar o dia a dia das pessoas. Um grande e meloso apaixonado por sua namorada que ama do fundo do coração =) (Pikena Te Amo !!! =D)

Loading Disqus Comments ...
Loading Facebook Comments ...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

* Copy This Password *

* Type Or Paste Password Here *