Oracle
 sql >> база данни >  >> RDS >> Oracle

Базиран на Oracle PIVOT с група от множество колони

Вие се завъртате върху фиксирана стойност, низовият литерал 'RM' , така че наистина не правите нищо полезно в пивота – изходът е същият, какъвто бихте получили при изпълнение на заявката „pivot_data“ самостоятелно:

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

Искате общите workhrs за всеки служител и опорна част от стаите, които са продали. Ако промените тази заявка, за да получите аналитичната сума на workhrs и класиране на стойностите на room/scr (и използвайки модерен синтаксис за свързване), получавате:

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

След това можете да завъртите този генериран rnk номер:

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                                            

Трябва да знаете максималния брой стаи, които всеки служител може да има - т.е. най-високия rnk може някога да бъде - и да включи всички тези в in клауза. Което означава, че е вероятно да се окажете с празни колони, както в този пример, където няма данни за 3_room или 3_scr . Не можете да избегнете това обаче, освен ако не получите XML резултат или не генерирате динамично заявката.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Форматиране на изход на заявки в SQLPlus

  2. Функция или процедура за клауза IN

  3. Oracle SQL:Как да четем и увеличаваме поле

  4. Метод за събиране:EXISTS Функция в базата данни на Oracle

  5. Spring JDBC Не можа да зареди клас JDBC драйвер [oracle.jdbc.driver.OracleDriver]