PIVOT TABLE, Funciona???

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
oliveira.tadeu
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 04 Jan 2018 10:18 am

Criei uma view com os sequintes campos:

codigo, referencia, valor;

executando uma consulta simples me retorna alguns dados:

Selecionar tudo

CODIGO    REFERENCIA      VALOR
----------------------------------------
AB6739	11/2017	        933,46
AB6858	12/2017	        933,46
AB2486	01/2018	        933,46
Tentei executar a query abaixo que vi em um exemplo na web:

Selecionar tudo

select * from table(pivot('select * from nome_da_view'));
O objetivo seria que retornasse os dados da seguinte maneira:

Selecionar tudo

CODIGO  11/2017     12/2017      01/2018
--------------------------------------------------
AB6739  933,46
AB6858                    933,46
AB2486                                      933,46
Ao invés do resultado acima ele retorna o erro:

Selecionar tudo

ORA-00904 - "PIVOT": identificador inválido.
segue o link de onde peguei o exemplo acima:
https://technology.amis.nl/2006/05/24/d ... s-thunder/

Por favor, alguém me socorra, já estou começando a acreditar que este pivot no oracle é uma farsa.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá,
A função PIVOT da oracle foi introduzida na versão 11.
Esse teu exemplo NÃO utiliza a função PIVOT da oracle. Ele tem a construção da função mais abaixo.

Se sua versão é 11 ou superior pode olhar em:
http://www.oracle.com/technetwork/pt/ar ... 3-ptb.html
http://www.oracle-developer.net/display.php?id=506
https://oracle-base.com/articles/11g/pi ... tors-11gr1
oliveira.tadeu
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 04 Jan 2018 10:18 am

Bom dia, eu vi os exemplos mas como o nome das colunas serão variáveis vindas das data de referência não deu certo, pois os exemplos todos trazem os nomes das colunas fixas.

Já tentei com a query abaixo mas também não obtive êxito, pois exibe duas mensagens de erro e ainda não sei como extrair os dados da coluna clob com o código xml.

Selecionar tudo

select distinct * from
(
select tcibem.codbem,
       tcibem.descrabrev,
       tcibem.numnota,
       nvl(ad_depacel.saldo, 0) as saldo,
       tcibem.dtfimdep,
       tcitax.taxa,
       tcibem.vlrsaldo,
       saldos.referencia,
       nvl(saldos.vlr_depreciado, 0) as vlr_depreciado
  from tcibem,
       ad_depacel,
       tgfpro,
       tcitax,
       (
       select  tcisal.codprod as codprod
       ,       tcisal.codbem  as codbem
       ,       to_char(tcisal.referencia, 'mm/yyyy') as referencia
       ,       tcisal.saldo as vlr_depreciado
       from    tcisal
       ) saldos 
 where ad_depacel.codbem (+) = tcibem.codbem 
   and tgfpro.codprod        = tcibem.codprod 
   and tcitax.codprod        = tcibem.codprod 
   and tcibem.codbem         <> '<TODOS>'
   and tcibem.numnota        is not null
   and saldos.referencia     is not null
   and saldos.codprod    (+) = tcibem.codprod 
   and saldos.codbem     (+) = tcibem.codbem
)
pivot xml (sum(nvl(vlr_depreciado, 0)) as vlr_depreciado for (referencia) in (select to_char(referencia, 'mm/yyyy') as referencia from tcisal))  
Anexos
Imagens de mensagem de erro e resultado retornado
Imagens de mensagem de erro e resultado retornado
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Bem,
uma forma de extrair os dados do XML seria como em:
https://stackoverflow.com/questions/368 ... l-xml-data
mas o que também obriga a definir quais dados você quer retornar.
Como sua necessidade é ser TOTALMENTE dinâmico, até onde conheço, o pivot padrão da oracle não lhe atende.
Mas pesquisei aqui e sua fonte original parece que resolve. No entanto, é preciso que criar os tipos e funções que é dada no final do artigo em "How it Works" e "Resources".
https://technology.amis.nl/2006/05/24/d ... s-thunder/
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante