[英]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.