需要查询以获得每个人的ID明智价值

时间:2012-10-16 16:46:03

标签: sql oracle10g pivot

  

可能重复:
  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

请建议我查询。

1 个答案:

答案 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

请参阅SQL Fiddle with Demo

如果您不知道这些值,那么您将需要使用此动态版本,类似于:

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