For defineret antal værdipar i kolonner tname, ttype
du kan bruge nedenstående forespørgsel (bemærk, at jeg ændrede dine kolonnenavne fra eksempel, fordi du brugte Oracle-nøgleord der, og jeg navngav også tabel som tasks
, så du bliver nødt til at ændre disse data til dine rigtige kolonnenavne og tabelnavn overalt i koden) :
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)));
For et dynamisk antal muligheder har du brug for en procedure, der "opretter" denne forespørgsel. Her brugte jeg view
til dette.Kopiér procedurekoden og kompiler den. Når data i din tabel ændres, skal du først køre proceduren, derefter skal du blot vælge fra visning oprettet af procedure. For at køre korrekt skal dit skema have rettigheder til at oprette visninger.
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
Du kan selvfølgelig ændre rækkefølgen af rækker og kolonner som du ønsker ved at tilføje eller ændre order by
dele i procedurekode:
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;
Jeg tror, der også er en mere universel løsning på dit spørgsmål i linket, jeg gav dig i kommentarerne:Dynamisk SQL-drejning... . Det ser meget lovende ud, bare læs omhyggeligt afsnittet Ressourcer nederst, og følg instruktionerne. Jeg tjekkede ikke denne metode personligt, men måske vil denne passe dig mere end min "procedure-view"-løsning.