SQL Server CE在2个日期之间选择每年的员工帖子数

时间:2012-10-31 10:37:14

标签: calendar sql-server-ce gaps-and-islands

我有一个Employees表,其中包含ID, PostID, StartDate, EndDate列。

样本数据

ID   PostID  StartDate   EndDate
----------------------------------------
1    1       2005/15/08   null      <---Null is still employed
2    2       2006/02/04  2006/08/06
3    1       2004/03/07  9999/12/31 <--- Can also be still Employed
4    2       2008/04/01   null

正确的结果将是

Year Post Total
2004 1    1
2005 1    2
2006 1    2
2006 2    1
2007 1    2
2007 2    0
2008 1    2
2008 2    1

请注意,2007年EmployeeID = 2 PostID = 2已被终止(Endate = 2006/08/06

想要返回特定PostID的总和

我用过

SUM(CASE WHEN PostID=1 THEN 1 ELSE 0 END) HPMP, 
  SUM(CASE WHEN PostID=4 THEN 1 ELSE 0 END) HPN,  
  SUM(CASE WHEN PostID=6 THEN 1 ELSE 0 END) HPMW

获取特定帖子

问题是我需要在1990年到2012年之间的每一年中对此进行分组

重要提示:我使用的是SQL Server CE,无法使用脚本或存储过程。

必须是按语句分组的选择。

1 个答案:

答案 0 :(得分:1)

首先,你需要一张年份表。一些DBMS有办法在运行中创建这些。假设年份表具有年份列,并且每年一行,那么以下内容应该起作用:

Select
  y.Year,
  e.PostID,
  Count(*) As Total
From
  Years y
    Inner Join
  Employees e
    On y.Year >= Year(e.StartDate) And (y.Year <= Year(e.EndDate) Or e.EndDate Is Null)
Group By
  y.Year,
  e.PostID
Order By
  1, 2

您可以添加where子句来限制年份范围。例如其中y.Year&gt; =年(GetDate()) - 5和y.Year&lt; =年(GetDate())

如果你想包括零:

Select
    y.Year,
    p.PostID,
    Count(e.ID) As Total
From
    Years y
        Cross Join
    (Select Distinct PostID From Employees) p
        Left Outer Join
    Employees e
        On 
            y.Year >= Year(e.StartDate) And 
            (y.Year <= Year(e.EndDate) Or e.EndDate Is Null) And
            p.PostID = e.PostID
Group By
    y.Year,
    p.PostID
Order By
    1, 2

如果您有帖子表,则使用此表而不是选择不同位