MySQL聚合函数误用咨询:avg(count())子查询错误原因排查
问题分析:
select avg(count(s.name)) from sub s group by s.name的错误原因 嘿,我来帮你拆解这个问题~核心问题是MySQL不允许在同一SELECT层级中直接嵌套聚合函数,你的写法刚好踩了这个规则的坑:
- 当你执行
group by s.name时,数据库会先按用户姓名分组,对每个组计算count(s.name)(也就是每个用户的通话次数),最终得到一组离散的数值结果(每个用户对应一个count值)。 - 但
avg()是需要对一组数值求平均的聚合函数,它不能直接接收另一个聚合函数的输出作为参数——在同一层级里,数据库还没完成count()的分组计算,无法把这些分组后的count值传给avg()处理。
正确的写法
要计算分组后count值的平均值,你需要把分组得到的count结果当成一个临时数据集,再在外层对这个数据集求平均,也就是用**子查询(派生表)**的方式:
select avg(call_count) from ( select count(s.name) as call_count from sub s group by s.name ) as temp_table
这里的逻辑很清晰:
- 内层子查询先按用户分组,计算每个用户的通话次数并命名为
call_count,生成一个临时表temp_table。 - 外层查询对临时表中的
call_count列求平均值,得到所有用户的人均通话次数。
修正后的完整查询语句
把这个正确的子查询替换到你原来的语句中,再补充一个小细节(适配MySQL的分组规则),就能得到你想要的结果:
select s.name, s.nr from sub s group by s.name, s.nr -- 注:MySQL 5.7+默认开启ONLY_FULL_GROUP_BY,select里的非聚合列需要出现在group by中 having count(s.name) > 10 * ( select avg(call_count) from ( select count(s.name) as call_count from sub s group by s.name ) as temp_table )
内容的提问来源于stack exchange,提问作者Meep Ep
相关产品推荐
相关产品推荐

