tabela de referencia cruzada

Oracle

11/06/2014

Olá, tenho buscado nos fórum uma solução para minha necessidade. Tenho uma base de dados Oracle 10g preciso listar uma determinada tabela de forma diferente

Tabela1
numeros | hora | data |
5|13:00|22/01/2014|
5|13:25|22/01/2014|
5| 09:35|23/03/2014|
2|12:00|21/02/2014|
6|10:50|18/03/2014|
1|15:00|05/04/2014

preciso lista-lás da seguinte forma:
listar todos com numero 5
| 22/01/2014|23/03/2014|
| 13:00 | 09:35 |
| 13:25 |

ou listar todos com numero 1
|05/04/2014|
| 15:00 |

etc...
transformar linha em coluna.

Agradeço.
Centro Guanabara

Centro Guanabara

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

11/06/2014

Tente pesquisar por PIVOT e UNPIVOT no Oracle, creio que seja a solução para sua necessidade.
GOSTEI 0
Centro Guanabara

Centro Guanabara

11/06/2014

pelo que li o PIVOT OU UNPIVOT somente funciona a partir da 11g minha versão é a 10g
GOSTEI 0
Lourival Queiroz

Lourival Queiroz

11/06/2014

Vc pode usar uma rotina assim: (Observar que a primeira coluna de cada linha deve ter "|'

begin
while true
  loop
   ler_registro(linha);
   if (Fim_arquivo) then
      goto Fim;
   end if;
   -- Formata a registro em n linhas
   for r in (select Rownum Numero,
                    SUBSTR(A.Str||'|',
                     INSTR(A.Str||'|' , '|', 1, Rownum )  + 1,
                     INSTR(A.Str||'|' , '|', 1, Rownum+1) -
                     INSTR(A.Str||'|' , '|', 1, Rownum )  - 1) Campo
                from (select '|5|13:00|22/01/2014|' Str
                        from dual) A,
                     all_objects B
               where rownum < length(A.Str) - length(REPLACE(A.Str,'|')) + 1)
     loop 
      -- Testa se Primeira Coluna está nos parametros pretendidos     
      if ((Numero = 1) and (Campo in ('1','5')) then 
         Guarda_Registro(linha); -- Guarda o registro
      end if;
     end loop;
<<Fim>>
fechar_arquivo;
end;
/

GOSTEI 0
Lourival Queiroz

Lourival Queiroz

11/06/2014

Observar que nesse select

(select '|5|13:00|22/01/2014|' Str
                        from dual) A


Vc substitui o "'|5|13:00|22/01/2014|'" por linha(registro lido)
GOSTEI 0
Lourival Queiroz

Lourival Queiroz

11/06/2014

Versão completa: (Observar que a forma de armazenar vc tem de criar de acordo com a coluna lida (1,2,3) e os testes efetuados)

-- Linha = '|5|13:00|22/01/2014|'
begin
while true
  loop
   ler_registro(linha);
   if (Fim_arquivo) then
      goto Fim;
   end if;
   -- Formata a registro em n linhas
   for r in (select Rownum Numero,
                    SUBSTR(A.Str||'|',
                     INSTR(A.Str||'|' , '|', 1, Rownum )  + 1,
                     INSTR(A.Str||'|' , '|', 1, Rownum+1) -
                     INSTR(A.Str||'|' , '|', 1, Rownum )  - 1) Campo
                from (select Linha Str
                        from dual) A,
                     all_objects B
               where rownum < length(A.Str) - length(REPLACE(A.Str,'|')) + 1)
     loop 
      -- Testa se Primeira Coluna está nos parametros pretendidos     
      if ((Numero = 1) and (Campo in ('1','5')) then 
         Guarda_Registro(linha); -- Guarda o registro
      end if;
      -- Ler a Hora
      if (Numero =2) then
          pega_hora(Campo);
      end if;
      -- Ler a Data
      if (Numero = 3) then
         Pega_Data(Campo);
         Finaliza(Linha) ; -- Passa para o próximo registro
      end if;
     end loop;
  end loop;
<<Fim>>
fechar_arquivo;
end;
/
GOSTEI 0
POSTAR