Voor gedefinieerd aantal waardeparen in kolommen tname, ttype
u kunt de onderstaande query gebruiken (merk op dat ik uw kolomnamen van bijvoorbeeld heb gewijzigd, omdat u daar Oracle-sleutelwoorden gebruikte, ook heb ik de tabel genoemd als tasks
, dus u zult deze gegevens overal in code moeten wijzigen in uw echte kolomnamen en tabelnaam) :
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)));
Voor een dynamisch aantal mogelijkheden heeft u een procedure nodig om deze query te "creëren". Hier gebruikte ik view
hiervoor.Kopieer de procedurecode en compileer deze. Als de gegevens in uw tabel veranderen, moet u eerst de procedure uitvoeren en vervolgens eenvoudig selecteren uit de weergave die door de procedure is gemaakt. Om goed te kunnen werken, heeft uw schema rechten nodig voor het maken van verleende weergaven.
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
Natuurlijk kunt u de volgorde van rijen en kolommen naar wens wijzigen door order by
toe te voegen of aan te passen onderdelen in procedurecode:
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;
Ik geloof dat er ook een meer universele oplossing is voor uw vraag in de link die ik u in opmerkingen heb gegeven:Dynamische SQL Pivoting... . Het ziet er veelbelovend uit, lees aandachtig de sectie Bronnen onderaan en volg de instructies. Ik heb deze methode niet persoonlijk gecontroleerd, maar misschien past dit meer bij je dan mijn "procedure-view"-oplossing.