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

学生考勤系统:合并官方/非官方考勤表COUNT统计异常解决

正确的学生考勤统计SQL语句

问题根源在于UNION只是简单合并两个查询的结果行,不会自动对同一学生的记录做聚合累加。以下是两种可行的解决方案:

方案1:分别统计两类考勤后关联求和

适合需要同时展示官方考勤次数、非官方考勤次数及总次数的场景:

SELECT 
    s.student_id,
    s.name,
    COALESCE(a.official_count, 0) AS official_attendance,
    COALESCE(ae.extra_count, 0) AS extra_attendance,
    COALESCE(a.official_count, 0) + COALESCE(ae.extra_count, 0) AS total_attendance
FROM stu s
LEFT JOIN (
    -- 统计每个学生的官方考勤次数
    SELECT student_id, COUNT(*) AS official_count
    FROM attendance
    GROUP BY student_id
) a ON s.student_id = a.student_id
LEFT JOIN (
    -- 统计每个学生的非官方考勤次数
    SELECT student_id, COUNT(*) AS extra_count
    FROM attendance_extra
    GROUP BY student_id
) ae ON s.student_id = ae.student_id
ORDER BY s.student_id;
  • COALESCE函数用于处理学生无某类考勤时的NULL值,将其转为0,避免求和结果异常。
  • LEFT JOIN确保所有学生(即使无任何考勤记录)都会被展示。

方案2:合并考勤记录后统一统计总次数

如果只需要总考勤次数,这种方式更简洁高效:

SELECT 
    s.student_id,
    s.name,
    COUNT(all_attendance.student_id) AS total_attendance
FROM stu s
LEFT JOIN (
    -- 合并两类考勤的学生ID记录(用UNION ALL避免去重,保留真实考勤次数)
    SELECT student_id FROM attendance
    UNION ALL
    SELECT student_id FROM attendance_extra
) all_attendance ON s.student_id = all_attendance.student_id
GROUP BY s.student_id, s.name
ORDER BY s.student_id;
  • 使用UNION ALL而非UNION,因为UNION会自动去重,可能导致考勤次数统计偏少,且UNION ALL执行效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:25:21