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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:12:27