Oracle 10g を使用しているため、PIVOT
機能はありません。CASE
したがって、集計関数を含むステートメントを使用して複製できます。列として必要な値がわかっている場合は、それをハードコーディングできます。
select p_id,
max(case when p_name = 'chetan' then p_value end) chetan,
max(case when p_name = 'john' then p_value end) john,
max(case when p_name = 'paul' then p_value end) paul
from table1
group by p_id
デモで SQL Fiddle を参照してください
値がわからない場合は、次のような動的バージョンを使用する必要があります。
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select P_id ';
begin
for x in (select distinct P_name from table1 order by 1)
loop
sql_query := sql_query ||
' , max(case when P_name = '''||x.P_name||''' then P_value end) as '||x.P_name;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from Table1 group by P_id';
open p_cursor for sql_query;
end;
/
次に、それを実行するには、次を使用できます。
variable x refcursor
exec dynamic_pivot(:x)
print x
結果は次のようになります。
P_ID CHETAN JOHN PAUL
---------- ---------- ---------- ----------
123 34 83 38
273 54 24 34