如何在 MySQL 中组合聚合函数?

Posted

技术标签:

【中文标题】如何在 MySQL 中组合聚合函数?【英文标题】:How to combine aggregate functions in MySQL? 【发布时间】:2010-08-04 20:31:13 【问题描述】:

我只是在学习 mysql - 有没有办法组合(或嵌套)聚合函数?

给定一个查询:

SELECT user, count(answer) FROM surveyValues WHERE study='a1' GROUP BY user;

这将为我提供每个用户回答的问题数量。我真正想要的是每个用户回答的平均问题数......类似于:

SELECT avg(count(answer)) FROM surveyValues WHERE study='a1';

计算此统计数据的正确方法是什么?

如果这是可能的,有没有办法为每个问题分解这个统计数据? (用户可以多次回答同一个问题)。比如:

SELECT avg(count(answer)) FROM surveyValues WHERE study='a1' GROUP BY question;

【问题讨论】:

【参考方案1】:

你必须使用子查询:

  SELECT x.user, 
         AVG(x.cnt)
    FROM (SELECT user, COUNT(answer) AS cnt
            FROM surveyValues 
           WHERE study='a1' 
        GROUP BY user) x
GROUP BY x.user

您不能用另一个聚合包装一个聚合。如果 MySQL 支持分析/排名/加窗函数,您可以将分析包装在聚合中...

【讨论】:

确实,子查询就是答案。如果您有多个查询来处理每个用户的答案数量,您可以考虑将子查询放入视图中。 哦,伙计,你可以给列加上别名吗?超级漂亮。 (我敢肯定这听起来很天真,但这让我很开心)。谢谢,完美运行。【参考方案2】:

是的 - 这些看起来都很合理。

您是否尝试过它们并收到了意想不到的结果?

通常,我希望您还将驱动列包括在选择列表中:

SELECT question, avg(count(answer)) 
FROM surveyValues 
WHERE study='a1' 
GROUP BY question; 

【讨论】:

以上是关于如何在 MySQL 中组合聚合函数?的主要内容,如果未能解决你的问题,请参考以下文章

26《MySQL 教程》聚合函数(聚合函数 MIN、MAX)

MySQL:在聚合函数中使用别名字段

MySQL聚合函数

SQL Server中的聚合函数都有哪些?

如何创建 MySQL 存储聚合函数?

mysql之聚合函数