Per un numero definito di coppie di valori nelle colonne tname, ttype
puoi utilizzare la query seguente (nota che ho cambiato i nomi delle colonne dall'esempio, perché hai usato le parole chiave Oracle lì, inoltre ho chiamato la tabella come tasks
, quindi dovrai modificare questi dati con i nomi delle colonne reali e il nome della tabella ovunque nel codice) :
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)));
Per il numero dinamico di possibilità avrai bisogno di qualche procedura per "creare" questa query. Qui ho usato view
per questo. Copia il codice della procedura e compilalo. Quando i dati nella tua tabella cambiano, devi prima eseguire la procedura, quindi seleziona semplicemente dalla vista creata dalla procedura. Per funzionare correttamente il tuo schema ha bisogno dei privilegi per la creazione di viste concessi.
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
Ovviamente puoi cambiare l'ordine di righe e colonne come desideri aggiungendo o modificando order by
parti in codice procedura:
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;
Credo che ci sia anche una soluzione più universale per la tua domanda nel link che ti ho dato nei commenti:Pivoting SQL dinamico... . Sembra molto promettente, basta leggere attentamente la sezione Risorse in fondo e segui i passaggi delle istruzioni. Non ho verificato personalmente questo metodo, ma forse questo ti si addice di più della mia soluzione di "visualizzazione della procedura".