[英]Oracle 12C SQL Aggregate Query Logic
我需要幫助編寫 SQL 查詢以用於以下混合聚合場景:考慮下面的 Emp Table。 需要按經理匯總員工記錄。
聚合邏輯:需要經理下的最高評級。 例如。 對於經理 10,評級應該是超級,對於 30,好
對於評級最低的 emp,需要 EmpDesig 和 Dob。 Sal 和 Bonus 應該由 Sum() 聚合。
Mgr Emp Rating EmpSal EmpDesig Bonus Dob
10 11 Avg 1000 JE 50 Jan-85
10 12 Good 1500 SE 30 Mar-85
10 12 Super 2000 ASE 60 Mar-84
20 21 Good 1000 SE 40 Apr-85
20 22 Avg 1000 AST 45 Dec-86
30 31 Good 500 SE 80 Oct-85
30 32 Good 1000 ASE 70 Jan-87
30 33 Avg 1500 ASC 90 Nov-85
30 34 Avg 500 JE 20 Jan-89
所以上述數據集的 Output 應該是
Mgr Rating EmpSal EmpDesig Bonus Dob
10 Super 4500 JE 140 Jan-85
20 Good 2000 AST 85 Dec-86
30 Good 3500 JE 260 Jan-89
Create table emp(MgrID number, EmpID number, varchar2(30),EmpSal number, EmpDesig
varchar2(30),
Bonus number, Dob varchar2(30));
insert into emp values (10, 11, 'Avg', 1000, 'JE', 50, 'Jan-85');
insert into emp values (10, 12, 'Good', 1500, 'SE', 30, 'Mar-85');
insert into emp values (10, 12, 'Super', 2000, 'ASE', 60, 'Mar-84');
insert into emp values (20, 21, 'Good', 1000, 'SE', 40, 'Apr-85');
insert into emp values (20, 22, 'Avg', 1000, 'AST', 45, 'Dec-86');
insert into emp values (30, 31, 'Good', 500, 'SE', 80, 'Oct-85');
insert into emp values (30, 32, 'Good', 1000, 'ASE', 70, 'Jan-87');
insert into emp values (30, 33, 'Avg', 1500, 'ASC', 90, 'Nov-85');
insert into emp values (30, 34, 'Avg', 500, 'ASC', 90, 'Jan-89');
我嘗試使用以下查詢構建邏輯,但不能。
Select mgr,
max(rating) over (partition by mgr order by case Rating when 'Super' then 1 when 'Good' then 2
when 'Avg' then 3 end) rating,
row_number () over (partition by mgr order by case Rating when 'Super' then 1 when 'Good' then 2
when 'Avg' then 3 end) rating_rnk,
sum(empSal),
sum(bonus),
max(empdesig) over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then 2
when 'Avg' then 1 end) empdesig,
row_number () over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then 2
when 'Avg' then 1 end) empdesig_rnk,
max(dob) over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then 2 when
'Avg' then 1 end) dob,
row_number () over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then
2 when 'Avg' then 1 end) dob_rnk
from
emp
group by mgr
這是條件聚合。 我認為關鍵是要列舉收視率:
SELECT mgrid,
(
CASE MIN(rating_order)
WHEN 1 THEN 'Super'
WHEN 2 THEN 'Good'
WHEN 3 THEN 'Avg'
END
) AS max_rating,
MAX(empdesig) KEEP (dense_rank first order by rating_order desc, empid) AS empdesig,
MAX(dob) KEEP (dense_rank first order by rating_order desc, empid) AS dob,
SUM(empsal) AS sal,
SUM(bonus)
FROM (SELECT e.*,
(
CASE rating
WHEN 'Super' THEN 1
WHEN 'Good' THEN 2
WHEN 'Avg' THEN 3 end ) as rating_order
FROM emp e
) e GROUP BY mgrid;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.