SQL:选择具有max(列)的列的不同总和

时间:2012-09-19 18:15:12

标签: sql

我有一张这样的工资表:

id | person_id | start_date  | pay
1  | 1234      | 2012-01-01  | 3000
2  | 1234      | 2012-05-01  | 3500
3  | 5678      | 2012-01-01  | 5000
4  | 5678      | 2013-01-01  | 6000
5  | 9101      | 2012-09-01  | 2000
6  | 9101      | 2014-04-01  | 3000
7  | 9101      | 2011-01-01  | 1500
and so on...

现在我想查询一个公司所有人的特定月薪的总和。

我已经拥有在特定公司特定月份工作的人员的ID,所以我可以做一些像WHERE person_id IN(...)

虽然工资查询有些问题。结果如下2012-08应该是:

10000

3500 + 5000 + 1500。

所以我需要找到最大start_date< =特定月份的总计支付价值(对于IN子句中的所有人)。

我尝试了各种INNER JOINS,但这是漫长的一天,我现在无法直接思考。

任何提示都受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

你必须使用group by来做这些事情......

  select person_id,sum(pay) from salary where person_id in(...) group by person_id

它可以帮助你......

答案 1 :(得分:0)

您需要获得有效记录。以下是通过计算相关月份之前的最长开始日期来实现的:

select sum(s.pay)
from (select person_id, max(start_date) as maxstartdate
      from salary
      where person_id in ( . . . ) and
            start_date < <first day of month of interest>
      group by person_id
   ) p join
   salary s
   on s.person_id = p.person_id and
      s.maxstartdate = p.start_date

您需要填写月份和ID列表。

您也可以使用排名函数执行此操作,但不指定您正在使用的SQL引擎。