2012-08-17 104 views
1

声明这是我有:SQL嵌套如果内部计数

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,星期二,星期六,星期一,星期六,星期六,星期六,星期六等)......所以我建立了一张桌子,可以容纳所有不同的班次其中8人),有9列:

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

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

所以我很想大家的输入2周的事情,

  1. 这是一个“好”的方式来捕捉我需要什么拍摄?
  2. 该SQL语句如何改变以使得发生次数正确,同时考虑到包装周末的无故缺勤但计为1次发生?
+0

因此,看起来人们实际上只会发生第二次事件的唯一时间是他们是否真的回到工作岗位并有另一次缺席。你记录他们在工作的日子吗? – UnhandledExcepSean 2012-08-17 13:14:12

+0

正确。如果某人在星期一无心再回到星期二工作,并在星期三再次出现,那是两次。 – Zamael 2012-08-17 13:19:12

+0

而员工的转变现在用上面描述的表格(tblShifts)捕获。 9列,是/否每周的每一天,他们的预定日期都有“是”值,他们的预定休息日是“不”值 – Zamael 2012-08-17 13:20:52

回答

0

这会更容易有一个更栏除了表tblOccurrence来实现。调用这个新的列,即:occupranceCounter。用触发器填充此列。无论何时向tblOccurence中插入新行,此触发器都会填充contaranceCounter列。

触发逻辑:检查员工的转变,检查最后由于缺少日期,当前由于缺少日期,如果天基础上,员工是连续的转移则保持occuranceCounter一样最后由于缺少的occuranceCounter另外通过一个递增occuranceCounter。

如果员工在一段时间内改变了数据变化,那么添加员工班次记录表将会很有帮助。