Това може да стане динамично по следния начин. Първо, ето статичната версия на заявката, за да можете да видите окончателния sql:
изберете c_id, p_id, max(случай, когато r_key='KEY1', след това r_value край) KEY1, max(случай, когато r_key='KEY2' след това r_value край) KEY2, max(случай, когато r_key='KEY3' след това r_value end) KEY3, max(случай, когато r_key='KEY4', след това r_value край) KEY4, max(случай, когато r_key='KEY5', след това r_value край) KEY5 от s_projectrolesgroup от c_id, p_id
Вижте SQL Fiddle с демонстрация
След това, за да направите това динамично, можете да създадете следната процедура:
СЪЗДАВАЙТЕ ИЛИ ЗАМЕНЕТЕ процедурата dynamic_pivot(p_cursor in out sys_refcursor)като sql_query varchar2(1000) :='изберете c_id, P_id'; започнете за x в (изберете различен r_key от s_projectroles, подредете по 1) цикъл sql_query :=sql_query || ' , max(случай, когато r_key ='''||x.r_key||''', след което r_value край) като '||x.r_key; dbms_output.put_line(sql_query); краен контур; sql_query :=sql_query || ' от s_projectroles група от c_id, p_id'; отворете p_cursor за sql_query; край;/
След това, за да го изпълните:
променлива x refcursorexec dynamic_pivot(:x)print x
Резултатът е същият:
<предварителен код>| C_ID | P_ID | КЛЮЧ1 | КЛЮЧ2 | КЛЮЧ3 | КЛЮЧ4 | КЛЮЧ5 |------------------------------------------------ ----------------| (нула) | (нула) | VALUE1 | СТОЙНОСТ2 | СТОЙНОСТ3 | (нула) | (нула) || 2 | 2 | (нула) | (нула) | (нула) | СТОЙНОСТ4 | (нула) || 2 | 3 | (нула) | (нула) | (нула) | (нула) | VALUE5 |