由于您使用的是 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