Calendar SQL Server CE选择2个日期之间每年的员工职位计数

Calendar SQL Server CE选择2个日期之间每年的员工职位计数,calendar,sql-server-ce,gaps-and-islands,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/

我有一个
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
请注意,在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,无法使用脚本或存储过程


必须是select grouped by语句。

首先,您需要一个年份表。有些数据库管理系统可以动态创建这些数据库。假设一个年份表有一个年份列,每年有一行,那么以下各项应该有效:

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
选择
y、 年,
e、 张贴,
将(*)计为总数
从…起
年复一年
内连接
雇员
年>=年(e.StartDate)和年(y.Year=年(GetDate())-5和年=年(e.StartDate)和

(y.Year谢谢Laurence。这非常有用。遗憾的是我必须有一个Year表。你可以用CTE动态生成它们,但我不确定SQL CE是否有它们。例如,SQL server也有一个未记录的表
master..spt_值
,其中包含可以使用的0到2047之间的数字。请参见示例。我也不确定CE是否有它。
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
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