2012-09-19 26 views
1

我有一個工資表是這樣的: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... 

現在我想查詢特定月份的工資總和爲公司的所有人員。

我已經有誰在特定月份特定的公司工作的人員的身份證,所以我可以做類似WHERE爲person_id IN(...)

我雖然有一些問題,與薪酬查詢。例如,結果2012-08應該是:

10000 

這就是3500 + 5000 + 1500。

所以我需要爲最大start_date < =特定月份找到總計支付價值(對於IN子句中的所有人)。

我嘗試了各種內部連接,但這是一個漫長的一天,我不能直截了當地認爲。

任何提示高度讚賞。

回答

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引擎。

+0

謝謝,這是正確的提示。 – user1683766

0

你必須使用group by這些東西....

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

可能它會幫助你.....