0

重複の可能性:
OracleSQLピボットクエリ

私は次のようなテーブル構造を持っています

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 に答える