【问题标题】:SQL / T-SQL update colums by rankSQL / T-SQL 按等级更新列
【发布时间】:2020-12-15 19:04:58
【问题描述】:
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, Amount) values (4, 12818);
insert into Sales (EMP_ID, Amount) values (4, 15381);
insert into Sales (EMP_ID, Amount) values (6, 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, Amount) values (3, 15046);
insert into Sales (EMP_ID, Amount) values (1, 17121);
insert into Sales (EMP_ID, Amount) values (6, 10556);
insert into Sales (EMP_ID, Amount) values (5, 16914);
insert into Sales (EMP_ID, Amount) values (8, 16786);
insert into Sales (EMP_ID, Amount) values (3, 12797);
insert into Sales (EMP_ID, Amount) values (8, 14005);
insert into Sales (EMP_ID, Amount) values (6, 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 ...

请帮忙

【问题讨论】:

  • 所以向我们展示您的尝试,以便我们帮助您完成它。
  • "我认为需要循环+ifs+update" SQL 是一种基于集合的语言。你不会循环你的记录。

标签: sql sql-server join sql-update window-functions


【解决方案1】:

您可以使用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

Demo on DB Fiddle

emp_id |平均金额 |工资 | rn |新工资 -----: | ---------: | -----: | -: | ---------: 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多