我的员工在数据库中有合同。我想知道员工是否是某个地点的新员工。我有以下数据结构:
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
如您所见,员工在某个地点可以拥有超过1份合同。然后Endate可以为null。
每个位置以及每月或每季度我想看看有多少员工入职。我想在我想要的数据期间使用@Startdate和@Enddate参数。
我应该考虑很多情况。比如,Index字段并不总是与Begindate一起增加,就像你在Index = 3看到的那样。
示例:
我想知道2013年1月有多少员工入职。
在这种情况下没有,因为第一份合同是在2012-01-01开始的。有两个新的合同,但这个员工并不是新的合同。但如果指数3不存在那么威尔应该是新员工。
可能是员工有两份合同是在同一天开始的,如果他在合同之前没有,那么就是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条记录并且我想在Janury 2013中认识新员工时,我希望:
LocationId NewEmployee
1 1
答案 0 :(得分:1)
启动员工这样的事情怎么样?
SELECT EmployeeID, LocationID, Min(StartDate)
FROM Contracts
GROUP BY EmployeeID, LocationID
HAVING Min(StartDate) between @Startdate and @Enddate
我会为Leavingemployee提出类似建议,但我不会花太多精力试图将这些内容放到一个查询中。它们似乎在功能上有所不同。
编辑:es,它应该是Min,而不是max。至于需要什么,我读到“我想看看有多少员工开始”,我没有太多理由让事情复杂化。 如果需要其他数据,则始终可以将其移动到子查询并在子查询中选择* where ...但是如果不需要...
为了仅处理活动合同(在查询的时间间隔内处于活动状态的合同),我们可以设置以下规则: 合约在我们正在考虑的期间的某个地方是否活跃,如果它的开始日期<参数enddate 和其enddate>参数startdate。
将它添加到我们的查询中,我们得到
SELECT EmployeeID, LocationID, Min(StartDate)
FROM Contracts
WHERE Startdate <= @Enddate
AND Enddate >= @Startdate
GROUP BY EmployeeID, LocationID
HAVING Min(StartDate) between @Startdate and @Enddate