För definierat antal värdepar i kolumnerna tname, ttype
du kan använda nedanstående fråga (observera att jag ändrade dina kolumnnamn från exempel, eftersom du använde Oracle-sökord där, och jag namngav tabellen som tasks
, så du måste ändra dessa data till dina riktiga kolumnnamn och tabellnamn överallt 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)));
För ett dynamiskt antal möjligheter behöver du någon procedur för att "skapa" denna fråga. Här använde jag view
för detta. Kopiera procedurkoden och kompilera den. När data i din tabell ändras måste du först köra proceduren, välj sedan helt enkelt från den vy som skapats av proceduren. För att ditt schema ska kunna köras korrekt behöver du behörighet för att skapa vyer.
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
Naturligtvis kan du ändra ordningen på rader och kolumner som du vill genom att lägga till eller ändra order by
delar i procedurkod:
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;
Jag tror att det också finns en mer universell lösning för din fråga i länken jag gav dig i kommentarerna:Dynamisk SQL-svängning... . Det ser mycket lovande ut, läs bara avsnittet Resurser noggrant längst ner och följ instruktionerna. Jag kontrollerade inte den här metoden personligen, men det kanske passar dig mer än min "procedur-view"-lösning.