MYSQL COUNT 结果并在按列分组时对它们进行 AVG

标签 mysql

我正在尝试选择过去 30 天每天的平均完成次数,然后取平均值。这是我的 Rundown 表的示例

RundownID | WorkOrderID | ForemanID | Completion | RundownDate
1         | 1           | 1         | 1          | 2017-10-27
2         | 2           | 1         | 1          | 2017-10-26
3         | 3           | 1         | 1          | 2017-10-20
4         | 4           | 1         | 1          | 2017-10-27
5         | 5           | 2         | 1          | 2017-10-27
6         | 6           | 2         | 1          | 2017-10-27
7         | 7           | 3         | 1          | 2017-10-25
8         | 8           | 2         | 0          | 2017-10-20

我要找的结果是

ForemanID | ForemanAvg
1         | 4
2         | 2
3         | 1

它应该获取过去 30 天内完成行的总数,并对每个唯一的 ForemanID 每天的总数进行平均。然后平均每天的总数给我最近 30 天的平均值

我知道我很接近,但我似乎无法正确配置它。这是我走了多远

SELECT
    ForemanID,
    COUNT(RundownDate) AS ForemanAvg
FROM Rundown
WHERE RundownDate > (DATE_SUB(CURDATE(), INTERVAL '30' Day))
AND Completion = 1
GROUP BY ForemanID 

结果

ForemanID | ForemanAvg
23        | 70
24        | 100
25        | 100
26        | 76
27        | 109
29        | 11

编辑:

我越来越近了。使用以下查询我得到了我想要的结果,但是由于某种原因它只给了我一个 ForemanID

SELECT 
    a.ForemanID,
    AVG(a.ForemanAvg)
FROM (SELECT
    RundownDate,
    ForemanID,
    COUNT(RundownDate) AS ForemanAvg
FROM Rundown
WHERE RundownDate > (DATE_SUB(CURDATE(), INTERVAL '30' Day))
AND Completion = 1
GROUP BY ForemanID, RundownDate ) AS a

最佳答案

以下查询应该有效:

SELECT
    ForemanID,
    count(*)/COUNT(distinct RundownDate) AS ForemanAvg
FROM Rundown
WHERE RundownDate > (DATE_SUB(CURDATE(), INTERVAL '30' Day))
AND Completion = 1
GROUP BY ForemanID;

希望对您有所帮助!

关于MYSQL COUNT 结果并在按列分组时对它们进行 AVG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980547/

相关文章:

mysql - 将 varchar() 限制为 a-z 范围

针对完全静态数据库的 MySQL 优化技巧?

mysql - SQL使用top或其他命令拉取数据

mysql - 带联合的 SQL 查询

php - 从 SELECT 查询的 'IN(....)' 内的数组返回数据

PHP 事件日志

mysql - 如果它通过类似的方法mysql,则计算行数

mysql - mssql 到 mysql 转换工具

MySQL:当子项匹配条件时选择父项

php - CakePHP GroupBy 以结构化格式显示所有行