我被要求创建一个进程,当员工达到第三次罢工时触发存储过程。罢工与缺勤有关,因此,如果员工在 3 个月内休假 3 次,它就会触发扳机。
但。。。这仅适用于单个缺勤情况,因此如果一个人不在;例如,在 11/01/2016、12/01/2016 和 13/01/2016 上,这是一个实例。这意味着我无法计算请病假的天数。
我有可用的数据,并且是我无法更新的固定过程:
Date | EmpID | EmpName
01/01/2016 | JS01 | John Spartan
02/01/2016 | JS01 | John Spartan
03/01/2016 | JS01 | John Spartan
08/01/2016 | JS01 | John Spartan
19/02/2016 | JS01 | John Spartan
12/02/2016 | JS01 | John Spartan
基于上述实例,实例超过 2 个。所以这将触发程序
IF EXISTS (<Query Here>)
BEGIN
EXEC usp_ThreeStrikes
END
有没有办法在 T-SQL 中执行此操作?
如果您无法添加列来帮助查询任务(例如。实例ID查询将分组以找出实例数),我认为最好的解决方案是为任务创建聚合CLR函数。
https://msdn.microsoft.com/en-us/library/ms131056.aspx
您可以尝试以下方法:
-
在表格中添加一个额外的列,以区分记录是否应考虑下一次警示(表示在 1 次实例之后,不应将其视为第二次)
-
根据以下条件创建 SQL 更新触发器以调用该过程:
- 获取其列被考虑用于下一次警示的记录(与您在第一步中创建的列相同)
- 对于这些特定记录,检查计数是否大于或等于 3,并调用存储过程
- 对于这些特定记录,请更新附加列(在步骤 1 中创建),使其不考虑用于后续警示
希望这有帮助。
这里有一个查询,列出了每季度缺席三次或更多次的empid
。可以在触发器中修改此查询,使其仅在触发器的inserted
表中存在的 empid/quarters 中进行选择。
PS:我添加了一些随机缺席,以表明查询仅在缺勤次数为三个或更多时才选择。
CREATE TABLE #absences(dt DATE,empid NVARCHAR(128),empname NVARCHAR(128));
INSERT INTO #absences(dt,empid,empname)VALUES
('20151212','JS02','John Spartan2'),
('20151213','JS02','John Spartan2'),
('20151010','JS01','John Spartan'),
('20151011','JS01','John Spartan'),
('20151217','JS02','John Spartan2'),
('20151219','JS02','John Spartan2'),
('20160101','JS01','John Spartan'),
('20160102','JS01','John Spartan'),
('20160103','JS01','John Spartan'),
('20160108','JS01','John Spartan'),
('20160201','JS02','John Spartan2'),
('20160203','JS02','John Spartan2'),
('20160219','JS01','John Spartan'),
('20160212','JS01','John Spartan');
SELECT
empid,
[quarter]=DATEADD(QUARTER,DATEDIFF(QUARTER,0,o.dt),0)
FROM
#absences AS o
WHERE
NOT EXISTS (
SELECT 1
FROM #absences AS i
WHERE i.empid=o.empid AND
DATEDIFF(QUARTER,0,i.dt)=DATEDIFF(QUARTER,0,o.dt) AND
i.dt=DATEADD(DAY,-1,o.dt)
)
GROUP BY
empid,
DATEDIFF(QUARTER,0,o.dt)
HAVING
COUNT(*)>=3;
DROP TABLE #absences;
结果:
+-------+-------------------------+
| empid | quarter |
+-------+-------------------------+
| JS02 | 2015-10-01 00:00:00.000 |
| JS01 | 2016-01-01 00:00:00.000 |
+-------+-------------------------+