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

oracle:動的列名

    Oracle10gを使用しているため、PIVOTはありません。 関数なので、CASEの集計関数を使用してこのタイプの変換を実行する必要があります ステートメント。

    値が事前にわかっている場合は、静的バージョンでハードコーディングできます。

    select s.ts_location,
      sum(case when p.tp_name = 'apple' then s.ts_sales else 0 end) Apple,
      sum(case when p.tp_name = 'mango' then s.ts_sales else 0 end) Mango,
      sum(case when p.tp_name = 'pineapple' then s.ts_sales else 0 end) Pineapple
    from tbl_sales s
    inner join tbl_products p
      on s.ts_tp_id = p.tp_id
    group by s.ts_location
    

    SQL Fiddle withDemo を参照してください。

    ただし、値が事前にわからない場合は、動的SQLを実装する必要があり、Oracleでは次の手順を使用する必要があります。

    CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
    as
        sql_query varchar2(1000) := 'select s.ts_location ';
    
        begin
            for x in (select distinct tp_name from tbl_products order by 1)
            loop
                sql_query := sql_query ||
                    ' , sum(case when p.tp_name = '''||x.tp_name||''' then s.ts_sales end) as '||x.tp_name;
    
                    dbms_output.put_line(sql_query);
            end loop;
    
            sql_query := sql_query || ' from tbl_sales s 
                                                    inner join tbl_products p
                                                      on s.ts_tp_id = p.tp_id
                                                    group by s.ts_location';
            dbms_output.put_line(sql_query);
    
            open p_cursor for sql_query;
        end;
    /
    

    次に、使用できる結果を返すために使用できます(注: これが私がToadで行う方法です):

    variable x refcursor
    exec dynamic_pivot(:x)
    print x
    

    どちらも結果を返します:

    | TS_LOCATION | APPLE | MANGO | PINEAPPLE |
    -------------------------------------------
    |          LN |     0 |    10 |        35 |
    |          QL |    25 |     0 |        20 |
    |          NY |   100 |     5 |        50 |
    



    1. mysqlクエリから複数のページを作成する

    2. SQLサーバーでUTCミリ秒をDATETIMEに変換する

    3. ディレクトリからutl_smtpで送信された電子メールにファイルを添付するにはどうすればよいですか

    4. SQL Server 2008でグループごとに最初と最後のレコードを取得するにはどうすればよいですか?