我有一个名为 Periods 的表,我需要使用其数据创建以下结构。
{
name: place_type
data: [[hour], avg(attendance)]
}
平均=出勤总和/课时数
例子:
{
name: "Swimming Room",
data: [["06:00", 10], ["07:00", 16], ["08:00", 28]]
}
基本上,我需要对 place_type、小时数和平均出勤率进行分组。
我写了这个查询,但我不知道如何计算平均值
SELECT
SUM(`periods`.`attendance`)/COUNT(*) AS sum_attendance,
place_types.name AS place_types_name,
LPAD(HOUR(`periods`.`start_at`), 2, 0) AS rounded_hour
FROM `periods` LEFT OUTER JOIN `place_types`
ON `place_types`.`id` = `periods`.`place_type_id`
WHERE `periods`.`location_id` = 131
AND (`periods`.`start_at` BETWEEN '2017-06-29 06:00:00' AND '2017-06-29 23:00:00')
GROUP BY place_types.name, rounded_hour
当前结果
sum_attendance place_types_name rounded_hour
1762 swim 14
1587 box 14
预期的结果是
sum_attendance place_types_name rounded_hour
avg swim 0
avg swim 1
avg swim 2
avg swim 3
avg swim 4
avg swim 5
avg swim 6
avg swim 7
...................... 平均游泳 23
avg box 1
........
avg box 23
更新 1
在除法器中添加 COUNT(*) 计算正确的平均值
SUM(`periods`.`attendance`)/COUNT(*) AS average_attendance
它产生以下结果:
sum_attendance place_types_name rounded_hour
160.1818 cardio 14
158.7000 esteira 14
149.8000 shape 14
但它仍然不会计算到每个单独的小时。
最佳答案
当 periods
中有数据时,此查询应该可以获取每小时的平均值:
SELECT AVG(p.`attendance`) AS sum_attendance,
pt.name AS place_types_name,
LPAD(HOUR(p.`start_at`), 2, 0) AS rounded_hour
FROM `periods` p LEFT OUTER JOIN
`place_types` pt
ON pt.`id` = p.`place_type_id`
WHERE p.`location_id` = 131 AND
p`.`start_at` BETWEEN '2017-06-29 06:00:00' AND '2017-06-29 23:00:00'
GROUP BY pt.name, rounded_hour;
如果您没有数据,则小时将不会显示在结果集中。
关于mysql - 按名称、时间和 sum_average 对时间段进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45197398/