如何使用php计算mysql的出勤率

时间:2018-04-23 19:44:38

标签: php mysql

我正在尝试开发一个简单的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

}

my attendance table structure

2 个答案:

答案 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

工作演示:http://sqlfiddle.com/#!9/35921c6/1