Oracle
 sql >> Database >  >> RDS >> Oracle

due colonne Pivoting in Oracle SQL

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