学生考勤系统:合并官方/非官方考勤表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
相关产品推荐
相关产品推荐

