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

Oracle10gでピボット

    Oracle 10gには、PIVOTはありませんでした。 機能しますが、CASEの集計を使用して複製できます :

    select usr,
      sum(case when tp ='T1' then cnt else 0 end) T1,
      sum(case when tp ='T2' then cnt else 0 end) T2,
      sum(case when tp ='T3' then cnt else 0 end) T3
    from temp
    group by usr;
    

    SQL Fiddle with Demo

    を参照してください

    Oracle 11g +を使用している場合は、PIVOTを使用できます。 機能:

    select *
    from temp
    pivot
    (
      sum(cnt)
      for tp in ('T1', 'T2', 'T3')
    ) piv
    

    SQL Fiddle with Demo

    を参照してください

    変換する値の数が不明な場合は、この動的バージョンを生成するプロシージャを作成できます。

    CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
    as
        sql_query varchar2(1000) := 'select usr ';
    
        begin
            for x in (select distinct tp from temp order by 1)
            loop
                sql_query := sql_query ||
                  ' , sum(case when tp = '''||x.tp||''' then cnt else 0 end) as '||x.tp;
    
                    dbms_output.put_line(sql_query);
            end loop;
    
            sql_query := sql_query || ' from temp group by usr';
    
            open p_cursor for sql_query;
        end;
    /
    

    次に、コードを実行します:

    variable x refcursor
    exec dynamic_pivot(:x)
    print x
    

    すべてのバージョンの結果は同じです:

    | USR | T1 | T2 | T3 |
    ----------------------
    |   1 | 17 |  0 |  0 |
    |   2 |  0 | 21 |  1 |
    |   3 | 45 |  0 |  0 |
    

    編集:Totalが必要な場合は、コメントに基づいて フィールドの場合、最も簡単な方法は、クエリを別のSELECT内に配置することです。 これに似ています:

    select usr,
      T1 + T2 + T3 as Total,
      T1,
      T2,
      T3
    from
    (
      select usr,
        sum(case when tp ='T1' then cnt else 0 end) T1,
        sum(case when tp ='T2' then cnt else 0 end) T2,
        sum(case when tp ='T3' then cnt else 0 end) T3
      from temp
      group by usr
    ) src;
    

    SQL Fiddle with Demo

    を参照してください

    1. 関係なく、IN値のデフォルトの結果を返します

    2. SQLステートメントを引数可能にする理由は何ですか?

    3. MySQL TIMEDIFF()とTIMESTAMPDIFF():違いは何ですか?

    4. SQL Server 2005で1つのステートメントで2つのテーブルを更新するにはどうすればよいですか?