sql >> Databáze >  >> RDS >> Oracle

Oracle PIVOT se skupinou více sloupců

Orientujete se na pevnou hodnotu, řetězcový literál 'RM' , takže v pivotu opravdu neděláte nic užitečného – výstup je stejný, jaký byste získali spuštěním dotazu „pivot_data“ samostatně:

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

Chcete agregované workhrs pro každého zaměstnance a pivot pokojů, které prodali. Pokud tento dotaz změníte, abyste získali analytický součet workhrs a pořadí hodnot room/scr (a pomocí moderní syntaxe spojení), které získáte:

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

Poté se můžete otočit na vygenerovaný rnk číslo:

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                                            

Potřebujete znát maximální počet pokojů, které může mít kterýkoli zaměstnanec – tj. nejvyšší rnk může někdy být - a zahrnout je všechny do in doložka. Což znamená, že pravděpodobně skončíte s prázdnými sloupci, jako v tomto příkladu, kde nejsou žádná data pro 3_room nebo 3_scr . Tomu se však nevyhnete, pokud nezískáte výsledek XML nebo dynamicky nevygenerujete dotaz.



  1. ORA-00838

  2. Jak se na jaře dotazovat na postgresové celočíselné pole

  3. Když jdeme na křížovou aplikaci a když jdeme na vnitřní spojení v SQL Server 2012

  4. MySQL stále padá