Ruby on rails ActiveRecord查询组和计数零值
我有一个考勤表,我正试图查询,以便创建一个数据集,我可以用它绘制图表。我的表存储考勤信息,如下所示:Ruby on rails ActiveRecord查询组和计数零值,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个考勤表,我正试图查询,以便创建一个数据集,我可以用它绘制图表。我的表存储考勤信息,如下所示: date | student_id | present | session | -----------|------------|---------|---------| 2012-09-01 | 1 | 1 | AM | 2012-09-01 | 1 | 1 | PM | 2012-09-01 | 2
date | student_id | present | session |
-----------|------------|---------|---------|
2012-09-01 | 1 | 1 | AM |
2012-09-01 | 1 | 1 | PM |
2012-09-01 | 2 | 0 | AM |
2012-09-01 | 2 | 1 | PM |
2012-09-02 | 1 | 0 | AM |
2012-09-02 | 1 | 0 | PM |
2012-09-02 | 2 | 0 | AM |
2012-09-02 | 2 | 0 | PM |
我试图以一个数据集结束,该数据集具有每个唯一的日期,以及当前分数的数量(最终除以2,以准确表示每天的出席人数)
到目前为止,这是我得到的最接近的一次
AttendanceMark.group(:date).count(:conditions => "present = 1")
但是这个结果不包括没有当前标记的日期。我该如何实现这一点呢?如果分别使用0和1表示现在和缺席,则可以构造如下查询
# For MySQL
AttendanceMark.group(:date).sum('CASE present WHEN TRUE THEN 1 ELSE 0 END')
# For SQLite
AttendanceMark.group(:date).sum('CASE WHEN present = "t" THEN 1 ELSE 0 END')
这会回来的
{ "2012-09-01" => 3, "2012-09-02" => 0 }
稍后,您可以将所有总和除以2。如果您分别使用0和1表示当前和不存在,则可以构造如下查询
# For MySQL
AttendanceMark.group(:date).sum('CASE present WHEN TRUE THEN 1 ELSE 0 END')
# For SQLite
AttendanceMark.group(:date).sum('CASE WHEN present = "t" THEN 1 ELSE 0 END')
这会回来的
{ "2012-09-01" => 3, "2012-09-02" => 0 }
您可以稍后将所有总和除以二。这是mysql中的tinyint(1)列,rails将其识别为布尔值,因此它不起作用:(.更新了我的答案。我们必须使用mysql case语句。注意,这与数据库有关。它是tinyint(1)mysql和rails中的列将其识别为布尔值,因此它不起作用:(.更新了我的答案。我们必须使用mysql case语句。请注意,这取决于数据库。