sql >> データベース >  >> RDS >> Oracle

テーブルOracleを動的にピボットする

    これは、次の方法で動的に実行できます。まず、クエリの静的バージョンを次に示します。これにより、最終的なSQLを確認できます。

    select c_id,
      p_id,
      max(case when r_key= 'KEY1' then r_value  end) KEY1,
      max(case when r_key= 'KEY2' then r_value  end) KEY2,
      max(case when r_key= 'KEY3' then r_value  end) KEY3,
      max(case when r_key= 'KEY4' then r_value  end) KEY4,
      max(case when r_key= 'KEY5' then r_value  end) KEY5
    from s_projectroles
    group by c_id, p_id
    

    SQL Fiddle with Demo

    を参照してください

    次に、これを動的に行うために、次の手順を作成できます。

    CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
    as
        sql_query varchar2(1000) := 'select c_id, P_id ';
    
        begin
            for x in (select distinct r_key from s_projectroles order by 1)
            loop
                sql_query := sql_query ||
                  ' , max(case when r_key = '''||x.r_key||''' then r_value end) as '||x.r_key;
    
                    dbms_output.put_line(sql_query);
            end loop;
    
            sql_query := sql_query || ' from s_projectroles group by c_id, p_id';
    
            open p_cursor for sql_query;
        end;
    /
    

    次にそれを実行するには:

    variable x refcursor
    exec dynamic_pivot(:x)
    print x
    

    結果は同じです:

    |   C_ID |   P_ID |   KEY1 |   KEY2 |   KEY3 |   KEY4 |   KEY5 |
    ----------------------------------------------------------------
    | (null) | (null) | VALUE1 | VALUE2 | VALUE3 | (null) | (null) |
    |      2 |      2 | (null) | (null) | (null) | VALUE4 | (null) |
    |      2 |      3 | (null) | (null) | (null) | (null) | VALUE5 |
    



    1. mysqli ::mysqli():(HY000 / 2002):ソケット「MySQL」を介してローカルMySQLサーバーに接続できません(2)

    2. PostgreSQLの隠された機能

    3. Android SQLiteOpenHelper:onCreate()メソッドが呼び出されないのはなぜですか?

    4. Oracleの空の文字列