如何用PHP从MySQL计算考勤百分比?开发考勤报表遇阻
嘿,我明白你现在卡在计算学生各考勤状态百分比这儿了,别着急,咱们一步步来解决这个问题。
核心思路
要生成你想要的报表,关键是按学生ID分组,先统计每个学生的总考勤次数,再分别统计每种状态的次数,最后用「某状态次数/总次数 × 100」得到百分比。
解决方案:SQL查询+PHP实现
第一步:编写正确的统计SQL
直接用SQL就能完成大部分计算,比在PHP里循环处理高效得多。以下是适配你表结构的查询语句:
SELECT sid, -- 计算每种状态的百分比,保留2位小数 ROUND((SUM(CASE WHEN attendance_status = 'present' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS present_percent, ROUND((SUM(CASE WHEN attendance_status = 'late' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS late_percent, ROUND((SUM(CASE WHEN attendance_status = 'permission' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS permission_percent, ROUND((SUM(CASE WHEN attendance_status = 'absent' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS absent_percent FROM attendance -- 可选:添加过滤条件,比如特定课程/学期/班级 -- WHERE course = 'CS101' AND semester = 'Fall 2024' AND section = 'A' GROUP BY sid;
COUNT(*):统计每个学生的总考勤记录数(即总考勤次数)SUM(CASE WHEN ...):精准统计对应状态的次数,符合条件记1,否则记0,求和后就是该状态的总次数ROUND(...,2):把百分比保留两位小数,让报表更整洁GROUP BY sid:确保所有计算都是按单个学生维度进行的
第二步:PHP代码集成
把上面的SQL嵌入到你的PHP代码里,就能生成目标报表了,示例如下:
<?php // 数据库连接(这里用mysqli做示例,你可以换成PDO) $conn = mysqli_connect("localhost", "你的用户名", "你的密码", "你的数据库名"); // 检查连接是否成功 if (!$conn) { die("连接失败: " . mysqli_connect_error()); } // 执行统计查询 $sql = " SELECT sid, ROUND((SUM(CASE WHEN attendance_status = 'present' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS present_percent, ROUND((SUM(CASE WHEN attendance_status = 'late' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS late_percent, ROUND((SUM(CASE WHEN attendance_status = 'permission' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS permission_percent, ROUND((SUM(CASE WHEN attendance_status = 'absent' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2) AS absent_percent FROM attendance GROUP BY sid "; $result = mysqli_query($conn, $sql); // 输出报表 if (mysqli_num_rows($result) > 0) { echo "<table border='1'> <tr> <th>sid</th> <th>present(%)</th> <th>late(%)</th> <th>permission(%)</th> <th>absent(%)</th> </tr>"; while($row = mysqli_fetch_assoc($result)) { echo "<tr> <td>{$row['sid']}</td> <td>{$row['present_percent']}%</td> <td>{$row['late_percent']}%</td> <td>{$row['permission_percent']}%</td> <td>{$row['absent_percent']}%</td> </tr>"; } echo "</table>"; } else { echo "暂无考勤记录"; } mysqli_close($conn); ?>
注意事项
- 确保
attendance_status字段的取值和SQL里的字符串完全匹配(比如大小写、拼写),否则统计会出错 - 如果某个学生没有某类状态的记录,对应的百分比会显示
0.00%,这是正常的 - 要是需要按课程/学期/班级生成报表,只需要在SQL的
WHERE子句里添加对应的过滤条件即可
内容的提问来源于stack exchange,提问作者Olana Kenea
相关产品推荐
相关产品推荐

