2010-08-13 110 views
2

比方說,我有一個這樣叫小時表:SQL - 如何查找年初至今的金額?

employee, payperiod, hours 
greg, 1/31/2010, 12 
greg, 1/31/2010, 15 
mark, 1/31/2010, 10 
mark, 1/31/2010, 11 
greg, 2/28/2010, 12 
greg, 2/28/2010, 15 
greg, 2/28/2010, 4 

我怎麼會發現,今年迄今爲止小時對於給定的員工和payperiod?

對於上面的例子我願意去:

employee, payperiod, hours_YTD 
greg, 1/31/2010, 27 
mark, 1/31/2010, 21 
greg, 2/28/2010, 58 
mark, 2/28/2010, 21 (this row is a nice to have, I can live without it if it's too tricky) 

到目前爲止,我已經試過,但總好像離:

select employee,payperiod,sum(hours) from hours h1 
join hours h2 on h2.payperiod<=h1.payperiod and h2.payperiod>=1/1/2010 
    and h1.employee=h2.employee 
group by h1.employee, h1.payperiod 

(我在SQL Server 2005)

+0

我對自連接感到困惑。有必要嗎? – FrustratedWithFormsDesigner 2010-08-13 19:55:48

+0

@Greg:看起來每個Emp + Date都是針對YTD的每個PP的總運行總數。這就是爲什麼馬克在2月28日是21,因爲該PP沒有條目。正確? – 2010-08-13 20:06:46

+0

@ p.campbell:是的,正好 – Greg 2010-08-13 20:14:40

回答

3

這將在SELECT中使用子查詢來獲得運行總數。

致力於在28日獲得馬克。

select employee, 
     payperiod, 
     (SELECT sum ([hours]) FROM @hours f2 
      WHERE f2.payperiod <= f.payperiod and f2.employee=f.employee) as hh 

from @hours as f 
where YEAR(payperiod) = year(getdate()) --current year. 
group by employee, payperiod 
order by payperiod 
1

可能有更好的方法來獲得今年的第一個,但這似乎更容易一些。

Select 
    H.employee 
    , H.payperiod 
    , (Select Sum(H1.hours) 
    From hours as H1   
    Where H1.employee = H.employee 
     and H1.payperiod <= H.payperiod 
    ) as hours_YTD 
from hours as H 
where Year(H.payperiod) = Year(GetDate() 
    and H.payperiod <= GetDate() 
group by employee 
    , payperiod 

*最後一行將需要一個全新的宗教實踐的研究,除非它是表還是有一些你不告訴我們。

+0

這不會將句點加在一起。例如2月份應該顯示2月份總和加上1月份的總和。 – Greg 2010-08-13 20:17:02