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

複数の列グループを持つOracleベースのPIVOT

    固定値、文字列リテラル'RM'を軸にしています 、したがって、ピボットで役立つことは何もしていません。出力は、「pivot_data」クエリを単独で実行した場合と同じです。

    SELECT eNAME,workhrs,room, SCR from PRODUCTIVITY p,PRODUCTIVITYd d, emp e, ROOMS R
    where p.PRODUCTIVITYID=d.PRODUCTIVITYID and e.empno=p.employeeid
    AND R.ID=P.ROOMID;
    
    ENAME    WORKHRS       ROOM        SCR
    ----- ---------- ---------- ----------
    JONES        3.6        101         53
    ALLEN       1.32        101         43
    ALLEN          6        102         22
    

    集約されたworkhrsが必要です 各従業員のために、そして彼らが売った部屋の要点。そのクエリを変更して、workhrsの分析合計を取得する場合 そして、あなたが得る部屋/ scr値のランキング(そして最新の結合構文を使用して):

    select e.ename, r.room, p.scr,
      sum(d.workhrs) over (partition by e.ename) as wrkhrs,
      rank() over (partition by e.ename order by r.room, p.scr) as rnk
    from productivity p
    join productivityd d on d.productivityid = p.productivityid
    join emp e on e.empno=p.employeeid
    join rooms r on r.id = p.roomid;
    
    ENAME       ROOM        SCR     WRKHRS        RNK
    ----- ---------- ---------- ---------- ----------
    ALLEN        101         43       7.32          1
    ALLEN        102         22       7.32          2
    JONES        101         53        3.6          1
    

    次に、生成されたrnkをピボットできます。 番号:

    with pivot_data as (
      select e.ename, r.room, p.scr,
        sum(d.workhrs) over (partition by e.ename) as wrkhrs,
        rank() over (partition by e.ename order by r.room, p.scr) as rnk
      from productivity p
      join productivityd d on d.productivityid = p.productivityid
      join emp e on e.empno=p.employeeid
      join rooms r on r.id = p.roomid
    )
    select *
    from   pivot_data
    pivot (
      min(room) as room, min(scr) as scr  --<-- pivot_clause
      for rnk                             --<-- pivot_for_clause        
      in  (1, 2, 3)                       --<-- pivot_in_clause         
    );
    
    ENAME     WRKHRS     1_ROOM      1_SCR     2_ROOM      2_SCR     3_ROOM      3_SCR
    ----- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    ALLEN       7.32        101         43        102         22                      
    JONES        3.6        101         53                                            
    

    従業員が持つことができる部屋の最大数、つまり最大のrnkを知る必要があります。 可能性があります-そしてそれらすべてをinに含める 句。つまり、3_roomのデータがないこの例のように、列が空になる可能性があります。 または3_scr 。ただし、XML結果を取得するか、クエリを動的に生成しない限り、これを回避することはできません。



    1. 条件付きの重複キー更新で?

    2. Oracle:プロシージャにコミットが含まれているかどうかをプログラムで確認できますか?

    3. PHPMySQLでjQueryAJAXを使用してリロードせずにフォームを送信する

    4. 日時フィールドのUTCをどのように取得しますか?