我正在尝试开发一个简单的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
}
答案 0 :(得分:0)
如果你想在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
答案 1 :(得分:0)
试试这个
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 sid