sql >> Databasteknik >  >> RDS >> Oracle

Oracle-baserad PIVOT med flera kolumner grupp

Du pivoterar på ett fast värde, den bokstavliga strängen 'RM' , så du gör verkligen inget användbart i pivoten - utdata är densamma som du får om du kör "pivot_data"-frågan på egen hand:

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 vill ha den sammanlagda workhrs för varje anställd, och en pivot av rummen de sålde. Om du ändrar den frågan för att få den analytiska summan av workhrs och en rangordning av rum/scr-värdena (och med modern join-syntax) 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 sedan pivotera på den genererade 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 måste veta det maximala antalet rum en anställd kan ha - det vill säga den högsta rnk någonsin skulle kunna vara - och inkludera alla dessa i in klausul. Vilket betyder att du sannolikt kommer att sluta med tomma kolumner, som i det här exemplet där det inte finns någon data för 3_room eller 3_scr . Du kan dock inte undvika det om du inte får ett XML-resultat eller genererar frågan dynamiskt.



  1. 4 sätt att lista alla vyer i en SQL Server-databas

  2. MySQL illegal blandning av sammanställningar när allt är sammanställt på samma sätt

  3. Hur identifierar man programmässigt en lagrad procedurs beroenden?

  4. Kan jag räkna sessioner för att bestämma antalet personer online?