SQL报错:SELECT列表引用users列未分组或聚合,求解决方法
解决SELECT列表引用未分组/聚合列的错误
你遇到的错误根源在于外部查询的逻辑问题:
- 外层的
GROUP BY user_value完全多余——base子查询已经按user_value分组,每条记录对应唯一的user_value,无需再次分组。 - 普通聚合函数
SUM(users)在GROUP BY后只会计算当前分组内的总和,但你需要的是全局所有用户数的总和来计算占比,这时候得用窗口函数替代普通聚合函数。
修正后的完整代码如下:
WITH base AS ( SELECT user_value, COUNT(l.user_id) AS users FROM table1 AS l LEFT JOIN table2 AS a ON l.user_id = a.user_id WHERE DATE_DIFF(CURRENT_DATE(), DATE(_PARTITIONTIME), DAY) <= 30 AND user_value IS NOT NULL GROUP BY user_value ) SELECT user_value, users, users / SUM(users) OVER() AS total_users -- 用窗口函数OVER()获取全局用户数总和 FROM base
关键修正点说明:
- 窗口函数替代普通聚合:
SUM(users) OVER()会计算整个base表中所有users的总和,而非分组内的局部总和,这样就能正确算出每个user_value对应的用户数占总用户数的比例。 - 移除多余分组:因为
base表已经是按user_value聚合后的结果,每条记录对应唯一的user_value,外层无需再执行GROUP BY。 - 顺手修复语法小问题:原代码里的
table 2(空格错误)、COUNT(l.user_id) AS users,(多余逗号)也一并修正了。
内容的提问来源于stack exchange,提问作者Eduardo Chacon
相关产品推荐
相关产品推荐

