Dla określonej liczby par wartości w kolumnach tname, ttype
możesz użyć poniższego zapytania (zauważ, że zmieniłem nazwy kolumn z przykładu, ponieważ użyłeś tam słów kluczowych Oracle, również nazwałem tabelę jako tasks
, więc będziesz musiał zmienić te dane na swoje prawdziwe nazwy kolumn i nazwę tabeli wszędzie w kodzie) :
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)));
Dla dynamicznej liczby możliwości będziesz potrzebować pewnej procedury "tworzenia" tego zapytania. Tutaj użyłem view
w tym celu.Skopiuj kod procedury i skompiluj ją. Kiedy dane w tabeli ulegną zmianie, musisz najpierw uruchomić procedurę, a następnie po prostu wybrać widok utworzony przez procedurę. Aby schemat działał poprawnie, musisz mieć przyznane uprawnienia do tworzenia widoków.
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
Oczywiście możesz zmienić kolejność wierszy i kolumn według własnego uznania, dodając lub modyfikując order by
części w kodzie procedury:
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;
Wierzę, że jest też bardziej uniwersalne rozwiązanie na Twoje pytanie w linku, który podałem w komentarzach:Dynamiczne obracanie SQL... . Wygląda bardzo obiecująco, po prostu przeczytaj uważnie sekcję Zasoby na dole i postępuj zgodnie z instrukcjami. Nie sprawdziłem tej metody osobiście, ale może to będzie Ci odpowiadać bardziej niż moje rozwiązanie „widok procedury”.