我有一张这样的工资表:
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,但这是漫长的一天,我现在无法直接思考。
任何提示都受到高度赞赏。
答案 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引擎。