2012-08-17 182 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。

如果員工在一段時間內改變了數據變化,那麼添加員工班次記錄表將會很有幫助。