【发布时间】:2011-03-29 04:12:12
【问题描述】:
问题:* 我正在尝试计算每个学生在特定班级中连续缺勤的次数。但是,如果该学生确实上课了一天,则需要重新开始计数。
例如如果班级 MATH1234 周一和周五有课,而学生 001234 第 1 周的周一、周五和第 2 周的周一缺课,但第 2 周周五缺课,则周一和周五缺课对于第 3 周,他们对该课程的连续缺勤计数为:
(这是我的课程表的精简版)
Class Day Week IsAbsent ConsecutiveAbs MATH1234 Mon 1 1 1 MATH1234 Fri 1 1 2 MATH1234 Mon 2 1 3 MATH1234 Fri 2 0 0 MATH1234 Mon 3 1 1 MATH1234 Fri 3 1 2
我有一个名为 Lessons 的表格,其中包含所有学生和他们注册的课程的运行列表,以及他们是否缺席任何课程:
课时([学号]、[班号]、[行号]、[学年]、[年]、[学期]、[周]、[日期间]、[ ClassDate], [IsAbsent], [ReasonCode], [ConsecutiveAbs])
鉴于上面的表格,我目前正在做的是像这样更新课程表来改变 ConsecutiveAbs 的值:
UPDATE Lessons
SET ConsecutiveAbs =
(SELECT ISNULL(SUM(CAST(IsAbsent AS numeric)), 0)
FROM Lessons AS L3
WHERE L3.IsAbsent = 1
AND L1.IsAbsent <> 0
AND L3.[Student ID] = L1.[Student ID]
AND L3.[Class Number] = L1.[Class Number]
AND L3.[Line Number] = L1.[Line Number]
AND L3.[Year] = L1.[Year]
AND L3.[ClassDate] <= L1.[ClassDate]
AND (L3.[ClassDate] > (SELECT MAX(L2.ClassDate)
FROM Lessons AS L2
WHERE L2.IsAbsent = 0
AND L2.[Student ID] = L1.[Student ID]
AND L2.[Class Number] = L1.[Class Number]
AND L2.[Line Number] = L1.[Line Number]
AND L2.[Year] = L1.[Year]
AND L2.ClassDate < L1.[ClassDate]
) OR (SELECT MAX(L2.ClassDate)
FROM Lessons AS L2
WHERE L2.IsAbsent = 0
AND L2.[Student ID] = L1.[Student ID]
AND L2.[Class Number] = L1.[Class Number]
AND L2.[Line Number] = L1.[Line Number]
AND L2.[Year] = L1.[Year]
AND L2.ClassDate < L1.[ClassDate]
) IS NULL))
FROM Lessons AS L1
但这忽略了学生实际上课的课程,只是不停地计算:(
Class Day Week IsAbsent ConsecutiveAbs MATH1234 Mon 1 1 1 MATH1234 Fri 1 1 2 MATH1234 Mon 2 1 3 MATH1234 Fri 2 0 4 MATH1234 Mon 3 1 5 MATH1234 Fri 3 1 6
有什么想法吗?
【问题讨论】:
-
其实没有。相似,但不一样。
-
由于您对我的解决方案有疑问,我对其进行了修改。请再试一次。 :)