【问题标题】:Withdraw all employees with the maximum bonus in each month. MAX(SUM) GROUP BY提取每个月最高奖金的所有员工。 MAX(SUM) 分组依据
【发布时间】:2020-07-11 19:36:44
【问题描述】:

如何提取每个月最高奖金的所有员工?

我有桌子:

id_prem id_emp  months                  premium
1       1       2016-01-01 00:00:00.000 3000
3       1       2016-01-01 00:00:00.000 2000
5       1       2016-03-01 00:00:00.000 3000
6       1       2016-01-16 00:00:00.000 3000
8       1       2016-01-11 00:00:00.000 2000
7       2       2016-02-14 00:00:00.000 5000
2       2       2016-02-01 00:00:00.000 5000
4       3       2016-02-01 00:00:00.000 1000
9       3       2016-02-09 00:00:00.000 1000

需要将每个员工每个月的奖金相加,得到最大的奖金 因此,只获得每月奖金最高的员工

我的查询:

SELECT id_emp, mon, MAX(sum_prem) as max_premium
FROM(SELECT id_emp, month(months) as mon, SUM(premium) as sum_prem FROM Employee.Emp_prem 
GROUP BY id_emp, month(months))as t 
GROUP BY id_emp, mon

结果:

id_emp mon  max_premium
1      1    10000
2      2    10000
3      2    2000
1      3    3000

这不是正确的结果。

因此,我需要只显示每个月的最高奖金。

【问题讨论】:

  • 大多数 DBMS 支持 RANK/ROW_NUMBER
  • 用您正在使用的数据库标记您的问题。

标签: sql sql-server


【解决方案1】:

我认为您希望使用窗口函数进行聚合。像这样的:

select e.*
from (select id_emp, year(months) as yyyy, month(months) as mm, sum(premium) as premium,
             row_number() over (partition by year(months), month(months) order by sum(premium) desc) as seqnum
      from Employee.Emp_prem 
      group by id_emp, year(months), month(months)
     ) e
where seqnum = 1;

【讨论】:

  • @БулатХуснутдинов 一定要接受戈登的回答。这是一种简单的方式来表达您对他的时间和才华的欣赏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2012-06-19
  • 2021-05-01
  • 2011-09-12
相关资源
最近更新 更多