【发布时间】:2013-11-15 20:52:43
【问题描述】:
我在数据库中有签订合同的员工。我想知道某个员工是否是某个地点的新员工。我有以下数据结构:
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
【问题讨论】:
-
所以无论如何你都必须在
BeginDate上使用Min(或类似的东西)。现在对于LeavingEmployee,您不介意他们在第一份合同之后是否还有另一份合同?你能用你的 3 行显示你想检索哪些信息吗? -
@RaphaëlAlthaus 查看编辑,所需的输出。
标签: sql sql-server stored-procedures