我正在尝试开发一个简单的php考勤系统,但我被卡住了。我想以这种形式从出席表中生成一份考勤报告:
sid | present(%) | late(%) | permission(%) | absent (%) |
| | | | |我遇到的问题是我不能计算出勤表中所有学生的百分比。我的考勤表的结构如下:
sid| course | smister| section | attendance_status | date |
| | | | | |守则可以是:
$query=slect * from attendance where course=course And semister = semister and section = section;
$result=mysqli_query(..,..);
while($row=$result_>fetch_assoc()){
//here calculate all selected students ateendance status in the above form
}

发布于 2018-04-23 20:20:47
如果您想在PHP中这样做,似乎需要“计算”出现的“当前”、“延迟”、“权限”和“缺席”记录的次数,以及记录的总数。对于每一个sid (我们假定它是学生id)。
按sid对行进行排序,并使用常规控制中断处理。当我们得到一个与前一行不同的sid行时,我们完成了前一个sid,因此发出所有计数器,并执行任何计算。
然后重置计数器,为积累这个新学生做好准备。
我建议将其作为一个更简单的问题来处理,例如,仅计算每个sid的行数。一旦工作正常,可以展开相同的模式以保持多个计数器,并根据行中的信息有条件地增加计数器。(例如,只对表示缺勤的行增加“缺席”计数器。
另一种选择是完全避免PHP中的繁琐操作,而只是让SQL使用条件聚合返回结果。
最简单的形式,获取每个sid的行数
SELECT a.sid
, COUNT(*) AS tot
FROM attendance a
GROUP BY a.sid
ORDER BY a.sid添加适当的WHERE子句(在GROUP BY子句之前),以限制我们正在查看的行。
我们可以扩展相同的模式,根据条件获得其他计数。我们只是猜测attendance表中哪些列可用,以及如何确定该行是否表示缺勤.
SELECT a.sid
, SUM(1) AS tot
, SUM(a.attendance_code = 'Absent') AS cnt_absent
, SUM(a.attendance_code = 'Tardy' ) AS cnt_late
, 100.0
* SUM(a.attendance_code = 'Absent')
/ SUM(1) AS pct_absent
, 100.0
* SUM(a.attendance_code = 'Tardy' )
/ SUM(1) AS pct_late
FROM attendance a
GROUP BY a.sid
ORDER BY a.sid发布于 2018-04-23 20:34:58
尝尝这个
SELECT sid,
ROUND((SUM(CASE WHEN attendance_status = 'Present' THEN 1 ELSE 0 END)/COUNT(*)*100),2) as present,
ROUND((SUM(CASE WHEN attendance_status = 'Late' THEN 1 ELSE 0 END)/COUNT(*)*100),2) as late,
ROUND((SUM(CASE WHEN attendance_status = 'Permission' THEN 1 ELSE 0 END)/COUNT(*)*100),2) as permission,
ROUND((SUM(CASE WHEN attendance_status = 'Absent' THEN 1 ELSE 0 END)/COUNT(*)*100),2) as absent
FROM attendance
GROUP BY sidhttps://stackoverflow.com/questions/49988836
复制相似问题