sql >> Database >  >> RDS >> Oracle

Op Oracle gebaseerde PIVOT met meerdere kolommengroep

Je draait op een vaste waarde, de letterlijke tekenreeks 'RM' , dus je doet echt niets nuttigs in de spil - de uitvoer is hetzelfde als je zou krijgen als je de 'pivot_data'-query alleen zou uitvoeren:

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

U wilt de totale workhrs voor elke werknemer, en een spil van de kamers die ze hebben verkocht. Als u die query wijzigt om de analytische som van workhrs te krijgen, en een rangschikking van de room/scr-waarden (en met behulp van moderne join-syntaxis) die je krijgt:

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

Je kunt dan draaien op die gegenereerde rnk nummer:

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                                            

U moet het maximale aantal kamers weten dat een werknemer mag hebben - d.w.z. de hoogste rnk ooit zou kunnen zijn - en neem ze allemaal op in de in clausule. Wat betekent dat u waarschijnlijk lege kolommen krijgt, zoals in dit voorbeeld waar er geen gegevens zijn voor 3_room of 3_scr . U kunt dat echter niet vermijden, tenzij u een XML-resultaat krijgt of de query dynamisch genereert.



  1. Is er een verkeerde code met mijn vraag om deel te nemen aan de tafel?

  2. Vervang tabelnaam door variabele. Python- en mysql-connector gebruiken

  3. Automatische verhoging toevoegen aan bestaande kolom zonder de huidige recordwaarden te beïnvloeden

  4. LEEFTIJD [1, 2, 3] vs. LEEFTIJD TUSSEN 1 EN 3