我有员工在数据库中有合同。我想知道某个员工是否是某个地点的新员工。我有以下数据结构:
EmployeeId Index BeginDate Enddate HoursToWork LocationId
12133 1 2013-01-01 2014-01-01 10 1
12133 2 2013-06-01 2014-01-01 20 1
12133 3 2012-01-01 2014-01-01 5 1
如您所见,一名员工可以在一个地点拥有一份以上的合同。那么 Endate 可以为空。
每个位置和每个月或每个季度我想看看有多少员工开始工作。我想在我想要数据的期间使用@Startdate 和@Enddate 参数。
我应该考虑很多情况。就像,Index 字段并不总是与 Begindate 一起增加,就像您在 Index = 3 处看到的那样。
例子:
我想知道2013年1月有多少员工入职。
在这种情况下什么都没有,因为第一份合同是在 2012-01-01 开始的。有两份新合同,但该员工对该地点并不陌生。但如果索引 3 不存在,那么 whis 应该是新员工。
可能是一个员工有两个在同一日期开始的合同,如果他在合同之前没有,那么它是 1 个新员工。
我已经尝试了以下方法,这在员工只有一份合同时有效。但是,如果有超过 1 份合同,则很难确定该员工是否是新员工:
declare @Startdate datetime set @Startdate = '2013-01-01'
declare @Enddate datetime set @Enddate = '2013-12-31'
select EmployeeId, Index, BeginDate, Enddate, HoursToWork, LocationId
,(case
when BeginDate between @Startdate and @Enddate then 1
end) as NewEmployee
,(case
when Enddate between @Startdate and @Enddate then 1
end) as LeavingEmployee
from Contracts
鉴于这 3 条记录,该员工不是新员工。我想要一个像这样的输出:
LocationId NewEmployee
1 0
当我只有前 2 条记录并且我想知道 2013 年 1 月的新员工时,我期望:
LocationId NewEmployee
1 1