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

Oracle baseret PIVOT med flere kolonner gruppe

Du pivoterer på en fast værdi, den bogstavelige streng 'RM' , så du gør virkelig ikke noget nyttigt i pivoten - outputtet er det samme, som du ville få ved at køre 'pivot_data'-forespørgslen alene:

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

Du vil have de samlede workhrs for hver medarbejder, og en pivot af de lokaler, de solgte. Hvis du ændrer den forespørgsel for at få den analytiske sum af workhrs og en rangering af rum/scr-værdierne (og ved hjælp af moderne joinsyntaks) får du:

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

Du kan derefter pivotere på den genererede 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                                            

Du skal kende det maksimale antal værelser, enhver medarbejder må have - dvs. den højeste rnk nogensinde kunne være - og inkludere alle dem i in klausul. Hvilket betyder, at du sandsynligvis ender med tomme kolonner, som i dette eksempel, hvor der ikke er nogen data for 3_room eller 3_scr . Du kan dog ikke undgå det, medmindre du får et XML-resultat eller genererer forespørgslen dynamisk.



  1. Postgres psql-outputstrenge uden escape-tegn

  2. Hvordan kontrollerer man, om strengværdien i én kolonne er delvist indeholdt i strengværdien af ​​en anden kolonne ved hjælp af SQL?

  3. Laravel - Querybuilder med join og concat

  4. MYSQL:Sådan konverteres en streng til en måned (antal)