Oracle
 sql >> Baza danych >  >> RDS >> Oracle

PIVOT oparty na Oracle z grupą wielu kolumn

Przestawiasz się na stałą wartość, literał ciągu 'RM' , więc naprawdę nie robisz nic użytecznego w osi — wynik jest taki sam, jak w przypadku samodzielnego uruchomienia zapytania „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

Chcesz zagregowane workhrs dla każdego pracownika oraz oś sprzedawanych przez nich pokoi. Jeśli zmienisz to zapytanie, aby uzyskać sumę analityczną workhrs i ranking wartości room/scr (i przy użyciu nowoczesnej składni join) otrzymujesz:

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

Następnie możesz przestawić na ten wygenerowany rnk numer:

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                                            

Musisz znać maksymalną liczbę pokoi, które może mieć każdy pracownik - tj. najwyższy rnk może kiedykolwiek być - i uwzględnij wszystkie te w in klauzula. Co oznacza, że ​​prawdopodobnie skończysz z pustymi kolumnami, jak w tym przykładzie, w którym nie ma danych dla 3_room lub 3_scr . Nie możesz tego jednak uniknąć, chyba że otrzymasz wynik XML lub dynamicznie wygenerujesz zapytanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kod źródłowy istniejącego obiektu w Oracle

  2. Jak ustawić wersję SDE w źródle przepływu danych SSIS?

  3. Jak połączyć wartości dwóch wierszy w jeden wiersz dla tego samego identyfikatora?

  4. Jak uzyskać liczbę rekordów za pomocą kursora odniesienia w oracle10g?

  5. Znak ucieczki pl-sql Oracle (dla ' )