【问题标题】:Decide if an employee is new or leavingemployee确定员工是新员工还是离职员工
【发布时间】: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


【解决方案1】:

这样的新员工怎么样?

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

我会为 Leavingemployee 提出类似的建议,但我不会花太多精力尝试将这些内容整合到一个查询中。似乎它们在功能上有所不同。

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

为了只处理活跃合约(在查询的时间间隔内活跃的合约),我们可以设置以下规则: 如果合约的开始日期 并且 结束日期 > 参数开始日期,则合约在我们正在查看的时间段内处于活动状态。

将其添加到我们的查询中,我们得到 ​​p>

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

【讨论】:

  • 1.他似乎需要 Enddate 和 HoursToWork。您似乎忘记了这一点,以使事情变得更容易 2. 应该是 Min,而不是 Max,不是吗?
  • @oerkelens:如果员工于 2012-01-01 开始工作,这将不起作用。因为在这种情况下,他不是新员工。
  • @Amedo:这就是为什么它被改为 MIN。由于 2012-01-01 不在您的范围内,因此他没有被选为新员工。
  • @oerkelens:你是对的。看起来不错。我如何确定没有其他情况会出错?我测试了以下几种情况: 3张合约:2张合约同时开始。其他是在时期选择之前。 2 份合同:它们都在期间选择之间开始。
  • 枚举所有可能的 scnarios 和测试,这是唯一确定的方法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2020-09-09
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
相关资源
最近更新 更多