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.