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

如您所见,一名员工可以在一个地点拥有一份以上的合同。那么 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
4

1 回答 1

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
于 2013-11-15T08:06:52.463 回答