Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

duas colunas pivotando no Oracle SQL


Para o número definido de pares de valores nas colunas tname, ttype você pode usar a consulta abaixo (observe que alterei os nomes das colunas do exemplo, porque você usou palavras-chave do Oracle lá, também nomeei a tabela como tasks , então você terá que alterar esses dados para seus nomes reais de coluna e nome de tabela em todo o código):
select * from tasks 
pivot (max(tdate) for (tname, ttype) in 
  (('DG1','CF') DG1_CF, ('M0','A')  M0_A,  ('M0','POR') M0_POR,
   ('M1','A'  ) M1_A,   ('M1','CF') M1_CF, ('M2','A')   M2_A)));

Para número dinâmico de possibilidades, você precisará de algum procedimento "criando" esta consulta. Aqui eu usei view para isso. Copie o código do procedimento e compile-o. Quando os dados da sua tabela são alterados, você deve primeiro executar o procedimento e, em seguida, basta selecionar na visualização criada pelo procedimento. Para executar corretamente, seu esquema precisa de privilégios para criar visualizações concedidas.
execute create_tasks_view;
select * from v_tasks;

anonymous block completed
   ID DG1_CF     M0_A       M0_POR     M1_A       M1_CF      M2_A     
----- ---------- ---------- ---------- ---------- ---------- ----------
45000 2015-03-02 2015-02-01 2015-03-11 2015-02-03 2015-03-01 2015-02-04 
44400 2015-02-02 2015-01-01 2015-02-11 2015-01-03 2015-02-01 2015-01-04

Claro que você pode alterar a ordem das linhas e colunas como desejar adicionando ou modificando order by partes no código do procedimento:
create or replace procedure create_tasks_view as 
  v_sql varchar2(32767) := '';
begin
  for v in (select distinct tname, ttype from tasks order by tname, ttype) 
  loop
    v_sql := v_sql || '(''' || v.tname || ''',''' || v.ttype || ''') '
      ||v.tname||'_'||v.ttype||',';
  end loop;
  v_sql := 'create or replace view v_tasks as '
    ||'select * from tasks pivot (max(tdate) for (tname, ttype) in ('
    ||rtrim(v_sql, ', ')||'))'; 
  execute immediate v_sql;
end create_tasks_view;

Acredito que também haja uma solução mais universal para sua pergunta no link que dei nos comentários:Pivoting SQL dinâmico... . Parece muito promissor, basta ler com atenção a seção Recursos na parte inferior e siga as etapas de instrução. Eu não verifiquei esse método pessoalmente, mas talvez isso seja mais adequado para você do que minha solução de "exibição de procedimento".