За определен брой двойки стойности в колони tname, ttype
можете да използвате заявката по-долу (имайте предвид, че промених имената на колоните ви от примера, тъй като използвахте ключови думи на Oracle там, също така наименувах таблицата като tasks
, така че ще трябва да промените тези данни на вашите истински имена на колони и име на таблица навсякъде в кода) :
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)));
За динамичен брой възможности ще ви трябва някаква процедура, "създаваща" тази заявка. Тук използвах view
за това. Копирайте кода на процедурата и го компилирайте. Когато данните във вашата таблица се променят, първо трябва да изпълните процедура, след което просто да изберете от изглед, създаден от процедура. За да работи правилно, вашата схема се нуждае от предоставени привилегии за създаване на изгледи.
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
Разбира се, можете да промените реда на редовете и колоните, както желаете, като добавите или промените order by
части в кода на процедурата:
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;
Вярвам, че има и по-универсално решение за вашия въпрос във връзката, която ви дадох в коментарите:Динамично SQL завъртане... . Изглежда много обещаващо, просто прочетете внимателно раздела Ресурси в долната част и следвайте стъпките от инструкциите. Не съм проверявал този метод лично, но може би това ще ви подхожда повече от моето решение за „изглед на процедурата“.