【发布时间】:2020-03-10 19:10:06
【问题描述】:
我在为以下混合聚合场景编写 SQL 查询时需要帮助: 考虑下面的 Emp 表。需要按经理汇总员工记录。
聚合逻辑: 需要经理下的最高评级。 例如。对于经理 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
所以上述数据集的输出应该是
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
【问题讨论】:
标签: sql oracle analytics aggregate-functions