2013-11-15 34 views
0

我有员工在数据库中有合同。我想知道员工是否是某个地点的新员工。我有以下数据结构:确定员工是新员工还是离职员工

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参数。

我应该考虑很多情况。一样,索引字段并不总是一起BEGINDATE增加,就像你可以看到指数= 3

例子:

我想知道有多少员工在2013年一月

启动在这种情况下,没有什么因为第一份合同在2012年1月1日开始。有两个新合同,但该员工对该位置不是新手。但如果索引3不存在,那么whis应该是一个新员工。

可能员工有两份合同在同一天开始,如果他没有合同,那么它是1名新员工。

我已经尝试了以下方法,当员工只有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

所以,无论如何,你将不得不使用上'BeginDate'一个'Min'(或等价的东西)。现在离职员工,你不介意他们在第一个合同之后是否有另一份合同?你可以用你的3行显示你想要检索的信息吗? –

+0

@RaphaëlAlthaus查看编辑,所需的输出。 – Amedo

回答

1

如何像这样的开始员工?

SELECT EmployeeID, LocationID, Min(StartDate) 
    FROM Contracts 
GROUP BY EmployeeID, LocationID 
HAVING Min(StartDate) between @Startdate and @Enddate 

我会建议为Leavingemployee类似的东西,但我不会花太多的精力试图让那些进入一个查询。看起来它们在功能上有所不同。

编辑:es,它应该是最小值,不是最大值。至于什么是需要的,我读了“我想看看有多少员工开始工作”,而且我没有看到太多的理由使事情复杂化。 如果需要额外的数据,它总是可以移动到一个子查询并选择* where ...在子查询中,但如果它不需要...

为了只处理活动合同我们可以设置以下规则: 在我们正在查看的期间,如果其开始日期为<参数结束日期它的结束日期>参数开始日期,则合同在某处处于活动状态。

并称,我们的查询,我们得到

SELECT EmployeeID, LocationID, Min(StartDate) 
    FROM Contracts 
WHERE Startdate <= @Enddate 
    AND Enddate >= @Startdate 
GROUP BY EmployeeID, LocationID 
HAVING Min(StartDate) between @Startdate and @Enddate 
+0

1.他似乎需要Enddate和HoursToWork。你似乎忘记了这一点,让事情变得更容易2.它应该是Min,而不是Max,不是? –

+0

@oerkelens:如果员工在2012年1月1日启动,这不起作用。因为在那种情况下,他不是新员工。 – Amedo

+0

@Amedo:这就是为什么它被改为MIN。由于2012-01-01不会落入你的范围,他不会被选为新员工。 – oerkelens