Muitas linhas em colunas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
siodoni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 23 Jul 2007 8:13 pm
Localização: Serrana - SP
Flavio A. S. Ximenes
siodoni@yahoo.com.br

Pessoal, tenho um problema pra resolver, seguinte tenho um select que me retorna várias linhas, esse select retorna as caracteristicas de um determinado bem.

Selecionar tudo

select a.bem,
       a.classe,
       a.tp_caracteristica,
       b.descricao,
       a.valor,
       a.ordem
  from pttp_caracteristica b,
       vptcaracteristica_bem a
 where a.bem                  = 18164
   and a.valor               is not null
   and b.id_tp_caracteristica = a.tp_caracteristica
Eu queria transformar as linhas em colunas, como posso explicar... o select acima me retorna o seguinte resultado

Selecionar tudo

BEM;CLASSE;TP_CARACTERISTICA;DESCRICAO;VALOR;ORDEM;
18164;214;8;RENAVAM;408932880;1;
18164;214;11;Nº DO DOCUMENTO;123456;2;
Porem eu queria que me retornasse o seguinte resultado

Selecionar tudo

BEM;CLASSE;RENAVAM;Nº DO DOCUMENTO;
18164;214;408932880;123456;
Não sei se fui claro nas explicações, caso tenham alguma sugestão para o meu problema eu ficaria grato.
tom
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Dom, 11 Jul 2004 8:45 pm
Localização: Guarulhos - SP

Isso dá conta de fazer o exemplo que você mostrou:

Selecionar tudo

select a.bem
,        a.classe
,        max(decode(b.descricao,'RENAVAM',a.valor,null)) RENAVAM
,        max(decode(b.descricao,'Nº DO DOCUMENTO',a.valor,null)) DOCUMENTO
from pttp_caracteristica b,
       vptcaracteristica_bem a
 where a.bem                  = 18164
   and a.valor               is not null
   and b.id_tp_caracteristica = a.tp_caracteristica
group by a.bem
,             a.classe
A parte chata é que o select não vai ser dinâmico. Pra cada descrição que você quiser que apareça, tem que incluir outro max(decode(...))
siodoni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 23 Jul 2007 8:13 pm
Localização: Serrana - SP
Flavio A. S. Ximenes
siodoni@yahoo.com.br

Essa ideia do max com decode é boa porém essa tabela de caracteristica cresce de acordo com a necessidade do usuário e dessa forma ficaria uma coisa "engessada".

alguém tem mais alguma sugestão?
siodoni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 23 Jul 2007 8:13 pm
Localização: Serrana - SP
Flavio A. S. Ximenes
siodoni@yahoo.com.br

E ai pessoal alguém tem mais alguma sugestão?
Eu ainda não consegui uma solução para esse problema...
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

No oracle 11g tem uma new feature assim:
http://www.oracle.com/technology/pub/ar ... pivot.html

Minha tabela:

Selecionar tudo

select cust_id, state_code, times_purchased
from customers
order by cust_id
/

CUST_ID STATE_CODE TIMES_PURCHASED
------- ---------- ---------------
      1 CT                       1
      2 NY                      10
      3 NJ                       2
      4 NY                       4
... etc ...
Agora, com o group-by:

Selecionar tudo

select state_code, times_purchased, count(1) cnt
from customers
group by state_code, times_purchased
/


ST TIMES_PURCHASED        CNT
-- --------------- ----------
CT               0         90
CT               1        165
CT               2        179
CT               3        173
CT               4        173
CT               5        152
... etc ...
Antes do oracle 11g, tinha que ser feito via DECODE (EXEMPLOS), mas agora:

Selecionar tudo

select * from (
   select times_purchased, state_code
   from customers t
)
pivot 
(
   count(state_code)
   for state_code in ('NY','CT','NJ','FL','MO')
)
order by times_purchased
/


. TIMES_PURCHASED       'NY'       'CT'       'NJ'       'FL'       'MO'
--------------- ---------- ---------- ---------- ---------- ----------
              0      16601         90          0          0          0
              1      33048        165          0          0          0
              2      33151        179          0          0          0
              3      32978        173          0          0          0
              4      33109        173          0          1          0
... etc ...
Responder
  • Informação
  • Quem está online

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