यह निम्नलिखित तरीके से गतिशील रूप से किया जा सकता है। सबसे पहले, यहां क्वेरी का स्थिर संस्करण दिया गया है ताकि आप अंतिम sql देख सकें:
select c_id,
p_id,
max(case when r_key= 'KEY1' then r_value end) KEY1,
max(case when r_key= 'KEY2' then r_value end) KEY2,
max(case when r_key= 'KEY3' then r_value end) KEY3,
max(case when r_key= 'KEY4' then r_value end) KEY4,
max(case when r_key= 'KEY5' then r_value end) KEY5
from s_projectroles
group by c_id, p_id
डेमो के साथ SQL Fiddle देखें
फिर इसे गतिशील रूप से करने के लिए, आप निम्न प्रक्रिया बना सकते हैं:
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select c_id, P_id ';
begin
for x in (select distinct r_key from s_projectroles order by 1)
loop
sql_query := sql_query ||
' , max(case when r_key = '''||x.r_key||''' then r_value end) as '||x.r_key;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from s_projectroles group by c_id, p_id';
open p_cursor for sql_query;
end;
/
फिर इसे निष्पादित करने के लिए:
variable x refcursor
exec dynamic_pivot(:x)
print x
नतीजा वही है:
| C_ID | P_ID | KEY1 | KEY2 | KEY3 | KEY4 | KEY5 |
----------------------------------------------------------------
| (null) | (null) | VALUE1 | VALUE2 | VALUE3 | (null) | (null) |
| 2 | 2 | (null) | (null) | (null) | VALUE4 | (null) |
| 2 | 3 | (null) | (null) | (null) | (null) | VALUE5 |