SQL统计平均评分对应critics、promoters数量时报1111组函数无效错误
报错原因解析
你遇到的General error: 1111 Invalid use of group function(通用错误:1111 分组函数使用无效)报错,核心原因是SQL不允许在同一个查询层级嵌套使用聚合函数:你写的SUM( IF( round(avg(items.value) ) <= 6, 1, 0) )中,AVG()和SUM()都属于聚合函数,在同一个GROUP BY category的聚合层级中,数据库无法在一次计算中同时完成「先算平均值、再按平均值统计计数」的两步操作。
解决方案
你需要拆分聚合逻辑,先通过子查询完成第一次聚合算出目标平均分值,再在外层做第二次聚合完成计数统计。
如果你的需求是常规NPS统计逻辑:先计算单条review下1、2、4号问题的平均得分,单条review的平均分四舍五入后<=6记为critics、>=9记为promoters,最后按category统计每个分类下的两类人群数量,正确写法如下:
SELECT category, SUM(IF(round(review_avg) <= 6, 1, 0)) AS critics, SUM(IF(round(review_avg) >= 9, 1, 0)) AS promoters FROM ( -- 内层先聚合计算单条review的指定问题平均得分 SELECT r.id AS review_id, r.category, AVG(i.value) AS review_avg FROM reviews r INNER JOIN items i ON r.id = i.review_id AND i.question_id IN (1,2,4) GROUP BY r.id, r.category ) AS review_avg_result GROUP BY category;
如果你需要按其他维度计算平均再统计,只需要调整内层GROUP BY后的分组维度即可。
内容的提问来源于stack exchange,提问作者Line in Linus
相关产品推荐
相关产品推荐

