1

我有一个这样的工资表:

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,但这是漫长的一天,我现在无法思考。

任何提示都非常感谢。

4

2 回答 2

0

您必须对这些事情使用group by ....

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

可能会帮助你......

于 2012-09-19T18:22:40.467 回答
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 引擎。

于 2012-09-19T18:24:26.363 回答