Pro definovaný počet párů hodnot ve sloupcích tname, ttype
můžete použít níže uvedený dotaz (všimněte si, že jsem změnil názvy vašich sloupců z příkladu, protože jste tam použili klíčová slova Oracle, také jsem pojmenoval tabulku jako tasks
, takže budete muset změnit tato data na vaše skutečné názvy sloupců a název tabulky všude v kódu):
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)));
Pro dynamický počet možností budete potřebovat nějakou proceduru "vytvoření" tohoto dotazu. Zde jsem použil view
zkopírujte kód procedury a zkompilujte jej. Když se data ve vaší tabulce změní, musíte nejprve spustit proceduru a poté jednoduše vybrat z pohledu vytvořeného procedurou. Aby vaše schéma fungovalo správně, potřebuje udělená oprávnění pro vytváření pohledů.
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
Samozřejmě můžete změnit pořadí řádků a sloupců, jak chcete, přidáním nebo úpravou order by
části v kódu 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;
Věřím, že existuje také univerzálnější řešení pro vaši otázku v odkazu, který jsem vám dal v komentářích:Dynamické pivotování SQL... . Vypadá to velmi slibně, jen si pozorně přečtěte sekci Zdroje dole a postupujte podle pokynů. Osobně jsem tuto metodu nekontroloval, ale možná vám bude vyhovovat více než moje řešení „pohled na proceduru“.