可能重复:
Oracle SQL pivot query
我有一个表结构如下
P_id P_name P_value
123 chetan 34
123 john 83
123 paul 38
273 chetan 54
273 john 24
273 paul 34
需要输出如下。
Pid chetan john paul
123 34 83 38
273 54 24 34
请建议我查询。
答案 0 :(得分:3)
由于您使用的是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
如果您不知道这些值,那么您将需要使用此动态版本,类似于:
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