SQL嵌套if count语句在count内

时间:2012-08-17 13:07:04

标签: sql ms-access if-statement count nested

这就是我所拥有的:

SELECT   Count(*) AS cnt 
FROM     tblOccurrence AS x 
WHERE    (((x.OccurrenceDate) Between DateAdd('m',-6,Date()) And Date()) 
         AND ((Exists ( SELECT * 
                        FROM tblOccurrence AS y 
                        WHERE y.TechID = x.TechID AND DATEADD ('d', -1, x.[OccurrenceDate]) = y.[OccurrenceDate]))=False) 
                        AND ((x.TechID)= " & Me.tbxTechID.Text & ")) 
GROUP BY x.TechID;

这用于计算员工缺勤的“发生率”,如果员工在1天内无故失业1次。如果他们连续5天没有理解,那么它仍然是一次。

这是完美的工作,直到有人指出,如果一名员工有一个M-F轮班,并在周五和周一打电话,那只有一次。为了让事情变得更加艰难,我们的员工变得非常大(MF,Tue-Sat,Sun-Mon,M-Tue& Fri-Sat等)......所以我建立了一个可以容纳所有不同班次的桌子(其中大约8个)有9列:

ID - ShiftName - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday

ShiftName是一个带有简短描述的文本字段(周一至周五,周二至周五,周日至周四等),然后是一周中的是/否字段。然后复选标记是预定的一天。

所以我希望每个人都能输入两件事,

  1. 这是捕捉我需要捕获的东西的“好方法”吗?
  2. 考虑到包裹周末但是算作1次的无故缺席,该SQL语句将如何更改以使事件计数正确?

1 个答案:

答案 0 :(得分:0)

通过在表tblOccurrence中再添加一列,这将更容易实现。称这个新专栏为:occuranceCounter。使用触发器填充此列。每当您在tblOccurence中插入一个新行时,此触发器将填充occuranceCounter列。

触发逻辑:检查员工的班次,检查上次缺席日期,当前缺席日期,如果根据员工班次连续几天,则将出现事件保持与最后一次缺席事件相同,然后将出现事件增加一次。

如果员工随时间推移数据变更,那么添加员工班次历史表将会很有帮助。