问题描述
create table Employees (
EMP_ID INT,SALARY INT
);
insert into Employees (EMP_ID,SALARY) values (1,1954);
insert into Employees (EMP_ID,SALARY) values (2,1360);
insert into Employees (EMP_ID,SALARY) values (3,3366);
insert into Employees (EMP_ID,SALARY) values (4,7765);
insert into Employees (EMP_ID,SALARY) values (5,4445);
insert into Employees (EMP_ID,SALARY) values (6,7064);
insert into Employees (EMP_ID,SALARY) values (7,5757);
insert into Employees (EMP_ID,SALARY) values (8,6562);
insert into Employees (EMP_ID,SALARY) values (9,5279);
insert into Employees (EMP_ID,SALARY) values (10,7283);
第二张表
create table Sales (
EMP_ID INT,Amount INT
);
insert into Sales (EMP_ID,Amount) values (6,14254);
insert into Sales (EMP_ID,Amount) values (4,16208);
insert into Sales (EMP_ID,12818);
insert into Sales (EMP_ID,15381);
insert into Sales (EMP_ID,17029);
insert into Sales (EMP_ID,Amount) values (10,19704);
insert into Sales (EMP_ID,Amount) values (9,10030);
insert into Sales (EMP_ID,Amount) values (2,10416);
insert into Sales (EMP_ID,Amount) values (3,13993);
insert into Sales (EMP_ID,Amount) values (1,18381);
insert into Sales (EMP_ID,Amount) values (5,12855);
insert into Sales (EMP_ID,Amount) values (8,10215);
insert into Sales (EMP_ID,15046);
insert into Sales (EMP_ID,17121);
insert into Sales (EMP_ID,10556);
insert into Sales (EMP_ID,16914);
insert into Sales (EMP_ID,16786);
insert into Sales (EMP_ID,12797);
insert into Sales (EMP_ID,14005);
insert into Sales (EMP_ID,18943);
我需要按条件更新员工薪水:等级1(+ 15%)等级 2(+ 10%)在其他表中按平均销售额排名3(+ 5%)。 只需要更新前3名 因此,在第一步中,我使用Dense_Rank
SELECT e.EMP_ID,AVG (Amount) as 'AVG_Amount',DENSE_RANK () OVER (ORDER BY AVG (Amount) DESC) AS 'DR'
FROM Employees e JOIN Sales s ON e.EMP_ID=s.EMP_ID
GROUP BY e.EMP_ID
EMP_ID AVG_Amount DR
10 19704 1
1 17751 2
6 15195 3
5 14884 4
4 14802 5
3 13945 6
8 13668 7
2 10416 8
9 10030 9
我不了解下一步。我认为需要循环+ ifs + update ...
请帮助
解决方法
您可以使用case
表达式。预聚合子查询,然后join
:
select
e.emp_id,s.avg_amount,e.salary,d.rn,salary * case s.rn
when 1 then 1.15
when 2 then 1.1
when 3 then 1.05
else 1
end as new_salary
from employees e
inner join (
select
emp_id,avg(amount) avg_amount,dense_rank () over (order by avg (amount) desc) as rn
from sales
group by emp_id
) s on s.emp_id = e.emp_id
order by d.rn
如果要使用update
语句:
update e
set e.salary =
e.salary * case s.rn
when 1 then 1.15
when 2 then 1.1
when 3 then 1.05
end
from employees e
inner join (
select
emp_id,dense_rank () over (order by avg (amount) desc) as rn
from sales
group by emp_id
) s on s.emp_id = e.emp_id
where s.rn <= 3
emp_id | avg_amount | salary | rn | new_salary -----: | ---------: | -----: | -: | ---------: 10 | 19704 | 7283 | 1 | 8375.45 1 | 17751 | 1954 | 2 | 2149.40 6 | 15195 | 7064 | 3 | 7417.20 5 | 14884 | 4445 | 4 | 4445.00 4 | 14802 | 7765 | 5 | 7765.00 3 | 13945 | 3366 | 6 | 3366.00 8 | 13668 | 6562 | 7 | 6562.00 2 | 10416 | 1360 | 8 | 1360.00 9 | 10030 | 5279 | 9 | 5279.00