Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

PIVOT dựa trên Oracle với nhiều nhóm cột

Bạn đang xoay vòng trên một giá trị cố định, chuỗi ký tự 'RM' , vì vậy bạn thực sự không làm bất cứ điều gì hữu ích trong pivot - kết quả giống như kết quả bạn nhận được khi tự chạy truy vấn '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

Bạn muốn tổng hợp workhrs cho từng nhân viên và tổng hợp các phòng mà họ đã bán. Nếu bạn thay đổi truy vấn đó để lấy tổng phân tích của workhrs và xếp hạng các giá trị room / scr (và sử dụng cú pháp nối hiện đại) mà bạn nhận được:

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

Sau đó, bạn có thể xoay trên rnk đã tạo đó số:

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                                            

Bạn cần biết số lượng phòng tối đa mà bất kỳ nhân viên nào có thể có - tức là rnk cao nhất có thể là - và bao gồm tất cả những thứ đó trong in mệnh đề. Điều đó có nghĩa là bạn có thể kết thúc với các cột trống, như trong ví dụ này, nơi không có dữ liệu cho 3_room hoặc 3_scr . Tuy nhiên, bạn không thể tránh được điều đó, trừ khi bạn nhận được kết quả XML hoặc tạo truy vấn động.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PLS-00103 tạo một bảng bên ngoài với SQL động

  2. Loại TABLE hoặc VARRAY ẩn danh trong Oracle

  3. Làm cách nào để tải các giá trị số Oracle sang .NET mà không có Zeros?

  4. Hàm CURRENT_TIMESTAMP () trong Oracle

  5. Oracle:Số ngày giữa hai ngày và Loại trừ các ngày trong tuần cách xử lý số âm