Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PIVOT berbasis Oracle dengan beberapa grup kolom

Anda berputar pada nilai tetap, string literal 'RM' , jadi Anda benar-benar tidak melakukan sesuatu yang berguna di pivot - outputnya sama dengan yang Anda dapatkan dari menjalankan kueri 'pivot_data' sendiri:

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

Anda ingin workhrs agregat untuk setiap karyawan, dan poros kamar yang mereka jual. Jika Anda mengubah kueri itu untuk mendapatkan jumlah analitik workhrs dan peringkat nilai room/scr (dan menggunakan sintaks gabungan modern) Anda mendapatkan:

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

Anda kemudian dapat memutar rnk yang dihasilkan itu nomor:

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                                            

Anda perlu mengetahui jumlah kamar maksimum yang mungkin dimiliki setiap karyawan - yaitu rnk tertinggi bisa jadi - dan sertakan semua yang ada di in ayat. Yang berarti Anda cenderung berakhir dengan kolom kosong, seperti dalam contoh ini di mana tidak ada data untuk 3_room atau 3_scr . Anda tidak dapat menghindarinya, kecuali jika Anda mendapatkan hasil XML atau membuat kueri secara dinamis.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa arti simbol '@' di Oracle SQL?

  2. Beberapa nilai maks dalam kueri

  3. Dapatkan kueri dari file di SPRING BOOT menggunakan @Query

  4. Tidak dapat menggunakan DROP TABLE JIKA ADA di schema.sql untuk aplikasi Spring Boot

  5. Baris SQL menjadi Kolom