Oracle
 sql >> Database >  >> RDS >> Oracle

PIVOT basato su Oracle con più gruppi di colonne

Stai facendo perno su un valore fisso, la stringa letterale 'RM' , quindi non stai facendo nulla di utile nel pivot:l'output è lo stesso che otterresti eseguendo la query 'pivot_data' da sola:

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

Vuoi le workhrs aggregate per ogni dipendente, e un perno delle stanze vendute. Se modifichi la query per ottenere la somma analitica di workhrs e una classifica dei valori room/scr (e usando la sintassi di join moderna) ottieni:

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

Puoi quindi ruotare su quel rnk generato numero:

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                                            

Devi conoscere il numero massimo di stanze che un dipendente può avere, ovvero il rnk più alto potrebbe mai essere - e includi tutti quelli nel in clausola. Ciò significa che probabilmente ti ritroverai con colonne vuote, come in questo esempio in cui non ci sono dati per 3_room o 3_scr . Tuttavia, non puoi evitarlo, a meno che tu non ottenga un risultato XML o generi la query in modo dinamico.