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".