You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access SQL:按教师分组统计各月份学生缺勤天数

嘿,我来帮你搞定这个全月份缺勤统计的需求!针对你已经完成1月份统计的情况,我们可以通过拆分跨月缺勤记录+生成全月份辅助列表的方式,实现按教师维度的12个月完整统计。

全月份教师缺勤统计解决方案

核心要解决两个问题:一是把跨月的缺勤记录正确拆分到对应月份,计算实际缺勤天数;二是确保每个教师的12个月份都有统计结果(哪怕缺勤天数为0)。

步骤1:生成1-12月的辅助月份列表

先通过UNION语句生成所有月份的基础列表,这能保证结果里每个月份都不会缺失:

SELECT 1 AS 月份 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12

步骤2:拆分缺勤记录到对应月份并计算天数

接下来关联学生表、缺勤记录表和月份列表,计算每条缺勤记录在每个月份的实际缺勤天数(比如12月30日到1月2日的缺勤,会拆分到12月和1月分别计算):

SELECT
    s.教师姓名,
    m.月份,
    SUM(
        IIF(
            Max(ae.缺勤起始日期, DateSerial(Year(ae.缺勤起始日期), m.月份, 1)) 
            <= Min(ae.缺勤结束日期, DateSerial(Year(ae.缺勤起始日期), m.月份 + 1, 0)),
            DateDiff("d", 
                Max(ae.缺勤起始日期, DateSerial(Year(ae.缺勤起始日期), m.月份, 1)),
                Min(ae.缺勤结束日期, DateSerial(Year(ae.缺勤起始日期), m.月份 + 1, 0))
            ) + 1,
            0
        )
    ) AS 当月缺勤天数
FROM
    Students s
INNER JOIN
    [Absence Extract] ae ON s.学生ID = ae.学生ID,
    (
        SELECT 1 AS 月份 UNION ALL
        SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
        SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
        SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL
        SELECT 11 UNION ALL SELECT 12
    ) AS m
GROUP BY
    s.教师姓名, m.月份

步骤3:补全教师无缺勤的月份(显示0天)

上面的查询只会返回有缺勤记录的教师-月份组合,如果需要显示所有教师的所有月份(包括缺勤天数为0的情况),用左连接补全即可:

-- 先获取所有教师的唯一列表
WITH AllTeachers AS (
    SELECT DISTINCT 教师姓名 FROM Students
),
-- 生成所有教师+所有月份的完整组合
TeacherMonths AS (
    SELECT
        at.教师姓名,
        m.月份
    FROM
        AllTeachers at,
        (
            SELECT 1 AS 月份 UNION ALL
            SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
            SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
            SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL
            SELECT 11 UNION ALL SELECT 12
        ) AS m
),
-- 计算有缺勤的教师-月份天数
AbsenceStats AS (
    SELECT
        s.教师姓名,
        m.月份,
        SUM(
            IIF(
                Max(ae.缺勤起始日期, DateSerial(Year(ae.缺勤起始日期), m.月份, 1)) 
                <= Min(ae.缺勤结束日期, DateSerial(Year(ae.缺勤起始日期), m.月份 + 1, 0)),
                DateDiff("d", 
                    Max(ae.缺勤起始日期, DateSerial(Year(ae.缺勤起始日期), m.月份, 1)),
                    Min(ae.缺勤结束日期, DateSerial(Year(ae.缺勤起始日期), m.月份 + 1, 0))
                ) + 1,
                0
            )
        ) AS 当月缺勤天数
    FROM
        Students s
    INNER JOIN
        [Absence Extract] ae ON s.学生ID = ae.学生ID,
        (
            SELECT 1 AS 月份 UNION ALL
            SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
            SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
            SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL
            SELECT 11 UNION ALL SELECT 12
        ) AS m
    GROUP BY
        s.教师姓名, m.月份
)
-- 左连接补全0天记录,确保每个教师每个月份都有结果
SELECT
    tm.教师姓名,
    tm.月份,
    Nz(as_.当月缺勤天数, 0) AS 当月缺勤天数
FROM
    TeacherMonths tm
LEFT JOIN
    AbsenceStats as_ ON tm.教师姓名 = as_.教师姓名 AND tm.月份 = as_.月份
ORDER BY
    tm.教师姓名, tm.月份

小提示

  • 如果你的缺勤记录涉及跨年,上面的查询默认按缺勤起始日期的年份统计。如果需要按自然年分组,只需在查询中添加年份字段的筛选或分组即可。
  • 确保Students和[Absence Extract]表的关联字段(比如学生ID)是匹配的,要是字段名不一样,记得修改JOIN条件。

内容的提问来源于stack exchange,提问作者Leroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:22:57