【问题标题】:SQL nested if statement inside countSQL 嵌套 if 语句在 count 中
【发布时间】:2012-08-13 22:34:22
【问题描述】:

这是我所拥有的:

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 轮班并在周五和周一打电话来,这只会发生 1 次。为了让事情变得更加艰难,我们的员工轮班非常大(MF,周二至周六,周日至周一,M-周二和周五至周六等)......所以我建立了一张桌子,可以容纳所有不同的班次(大约其中 8 个)有 9 列:

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

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

所以我希望大家对两件事提出意见,

  1. 这是捕获我需要捕获的内容的“好”方式吗?
  2. 考虑到周末无故缺勤但计为 1 次,该 SQL 语句将如何更改以使出现次数正确?

【问题讨论】:

  • 因此,似乎一个人实际上会再次出现第二次的情况是,如果他们真的重返工作岗位并再次缺勤。你记录他们工作的日子吗?
  • 正确。如果有人在周一无故回到周二上班并在周三再次下班,则发生 2 次。
  • 现在员工的班次是用我上面描述的表格 (tblShifts) 捕获的。 9 列,一周中的每一天是/否,其预定日期为“是”值,其预定休息日为“否”值
  • 你记录他们工作的日子吗?我不是指日程安排,而是他们实际上在工作。如果是这样,那么谁在乎他们的日程安排是什么?所有缺勤均以出勤率划分;我会先尝试这条路线。
  • 没有。该程序旨在跟踪无故缺勤,仅此而已。因此,我们将在员工无故缺勤时进入。

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


【解决方案1】:

在表 tblOccurrence 中增加一列会更容易实现。调用这个新列,即:occurranceCounter。使用触发器填充此列。每当您在 tblOccurence 中插入新行时,此触发器都会填充occurranceCounter 列。

触发逻辑:检查员工的班次,检查上次缺勤日期,当前缺勤日期,如果根据员工班次连续天数,则保持发生计数器与上次缺勤的发生计数器相同,否则将发生计数器加一。

如果员工轮班数据随时间变化,那么添加员工轮班历史表会很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多