PIVOT TABLE, Funciona???

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Sex, 05 Jan 2018 2:15 pm

Criei uma view com os sequintes campos:

codigo, referencia, valor;

executando uma consulta simples me retorna alguns dados:

Código: Selecionar todos
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:
Código: Selecionar todos
select * from table(pivot('select * from nome_da_view'));

O objetivo seria que retornasse os dados da seguinte maneira:
Código: Selecionar todos
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: 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.
oliveira.tadeu

Mensagemem Sex, 05 Jan 2018 4:06 pm

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/articles/sql/principais-caracteristicas-database-2108383-ptb.html
http://www.oracle-developer.net/display.php?id=506
https://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Seg, 08 Jan 2018 7:14 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.

Código: Selecionar todos
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 query pivot xml.jpg
Imagens de mensagem de erro e resultado retornado
oliveira.tadeu

Mensagemem Seg, 08 Jan 2018 8:04 am

Bem,
uma forma de extrair os dados do XML seria como em:
https://stackoverflow.com/questions/36884702/oracle-11g-extractvalue-to-return-all-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/dynamic-sql-pivoting-stealing-antons-thunder/
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes

cron