Oracle 12C SQL聚合查询逻辑
我需要帮助为以下混合聚合场景编写SQL查询: 考虑下面的EMP表。需要按经理汇总员工记录 聚合逻辑: 需要在经理的领导下获得最高评级。 对于经理10,评级应该是超级,对于经理30,评级应该是好的 最低等级的emp需要EmpDesig和Dob。 Sal和奖金应通过Sum()合计 所以上述数据集的输出应该是Oracle 12C SQL聚合查询逻辑,sql,oracle,analytics,aggregate-functions,Sql,Oracle,Analytics,Aggregate Functions,我需要帮助为以下混合聚合场景编写SQL查询: 考虑下面的EMP表。需要按经理汇总员工记录 聚合逻辑: 需要在经理的领导下获得最高评级。 对于经理10,评级应该是超级,对于经理30,评级应该是好的 最低等级的emp需要EmpDesig和Dob。 Sal和奖金应通过Sum()合计 所以上述数据集的输出应该是 Mgr Rating EmpSal EmpDesig Bonus Dob 10 Super 4500 JE 140 Jan-85 20
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;
这是条件聚合。我认为关键在于列举评级:
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;