基于学期起止日期计算学生每周出勤占比的SQL查询需求
按周统计学生出勤百分比的解决方案
嘿,我来帮你把现有的总出勤统计扩展成按周统计每位学生的出勤百分比,刚好适配你指定学期起止日期的需求!
核心思路
要实现按周统计,关键是把出勤日期映射到对应的周,然后按「学生ID + 周」分组计算出勤占比,同时加上日期范围筛选来限定学期。
完整SQL代码(以SQL Server为例)
-- 先定义学期的起止日期,直接修改这里的日期就行 DECLARE @TermStartDate DATE = '2024-09-02'; DECLARE @TermEndDate DATE = '2025-01-17'; SELECT PupilID, DATEPART(wk, AttendanceDate) AS WeekOfYear, -- 当年的周数 DATEADD(wk, DATEDIFF(wk, 0, AttendanceDate), 0) AS WeekStartDate, -- 显示每周的周一(SQL Server默认周起始是周一) -- 计算出勤百分比:出勤次数/总应出勤次数 * 100,用100.0避免整数除法 ROUND((SUM(CASE WHEN IsInAttendance = 1 THEN 1 ELSE 0 END) * 100.0) / COUNT(IsInAttendance), 2) AS WeeklyAttendancePercent FROM #CombinedAttClSe -- 筛选学期范围内的出勤记录 WHERE AttendanceDate BETWEEN @TermStartDate AND @TermEndDate -- 按学生和周分组,确保每个学生每周一条统计结果 GROUP BY PupilID, DATEPART(wk, AttendanceDate), DATEADD(wk, DATEDIFF(wk, 0, AttendanceDate), 0) -- 按学生ID和周数排序,结果更清晰 ORDER BY PupilID, WeekOfYear;
关键细节说明
- 日期变量:用
DECLARE定义学期起止日期,你只需要替换成实际的学期日期即可,非常灵活。 - 周的展示:除了周数,我加了
WeekStartDate字段,能直观看到这是哪一周的统计(比如2024-09-02是周一),比单纯的周数更友好。 - 百分比计算:用
100.0而不是100,是为了避免SQL的整数除法问题(如果用100,整数相除会直接取整,比如3/4会变成0,乘以100还是0,而用100.0会得到75.0)。 - 分组逻辑:必须同时按
PupilID和周相关字段分组,这样才能得到每个学生每周的独立统计结果。
适配其他数据库的小调整
如果你的数据库不是SQL Server,只需要修改周相关的函数:
- MySQL:把
DATEPART(wk, AttendanceDate)换成WEEK(AttendanceDate),WeekStartDate换成DATE_SUB(AttendanceDate, INTERVAL WEEKDAY(AttendanceDate) DAY) - PostgreSQL:用
EXTRACT(WEEK FROM AttendanceDate)获取周数,WeekStartDate可以用DATE_TRUNC('week', AttendanceDate)
进阶补充(可选)
如果有些周学生没有任何出勤记录(比如整周请假),你想在结果中显示该周的出勤百分比为0%,可以先生成一个包含学期内所有周的日历表,再和出勤表做左连接。需要的话可以再问我具体实现~
内容的提问来源于stack exchange,提问作者Jack Clarke
相关产品推荐
相关产品推荐

