0

可能重复:
Oracle SQL 数据透视查询

我有一个表结构如下

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

请建议我查询。

4

1 回答 1

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

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

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
于 2012-10-16T16:50:53.470 回答