我被要求创建一个流程,当员工遇到第三次攻击时触发存储过程。罢工与缺席有关,因此如果员工在3个月内关闭3次,则会触发。
但是...... 这仅适用于单个缺席情况,所以如果一个人不在;例如,在2016年1月11日,2016年1月12日& 2016年1月13日这是一个例子。这意味着我不能指望生病的天数。
我可用的数据是一个我无法更新的固定过程:
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中执行此操作?
答案 0 :(得分:0)
如果你不能添加列来帮助查询任务(例如,InstanceID查询将分组以查找实例数),我认为最好的解决方案是为任务创建聚合CLR函数。 / p>
答案 1 :(得分:0)
您可以尝试以下方法:
在表格中添加一个额外的列,以区分是否应该考虑将记录用于下一次攻击(意味着在1次实例之后,不应将其视为第二次)
根据以下条件创建SQL Update触发器以调用该过程:
希望这有帮助。
答案 2 :(得分:0)
在这里,您有一个查询,其中列出了每季度缺席三次或更多次的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 |
+-------+-------------------------+