Oracle SQL按group_number分组拼接rate值至table_2新列报错如何解决
报错原因
你写的SQL触发了聚合查询的语法约束:使用GROUP BY分组时,SELECT子句里只能出现两类内容:GROUP BY指定的分组字段、聚合函数的计算结果。你用了SELECT *会取出date、c_id等非分组也非聚合的字段,自然会触发"not a group by expression"报错。
另外你当前的写法只处理了table_1的拼接逻辑,还没有和table_2关联,无法直接得到目标结果。
正确实现方案
实现逻辑:先对table_1按group_number分组,先对同分组下重复的c_id记录去重,再拼接rate值,最后将拼接结果和table_2按group_number关联即可。
支持LISTAGG的数据库(Oracle 11g+、PostgreSQL 11+、Hive等)写法:
SELECT t2.date, t2.group_number, t1_group.rate_for_groups FROM table_2 t2 LEFT JOIN ( SELECT group_number, LISTAGG(rate, ', ') WITHIN GROUP (ORDER BY c_id) AS rate_for_groups FROM ( -- 去重同分组下相同c_id的重复记录,避免拼接出重复值 SELECT DISTINCT group_number, c_id, rate FROM table_1 ) t1_distinct GROUP BY group_number ) t1_group ON t2.group_number = t1_group.group_number;
MySQL 8.0+/MariaDB写法(对应替换为GROUP_CONCAT函数):
SELECT t2.date, t2.group_number, t1_group.rate_for_groups FROM table_2 t2 LEFT JOIN ( SELECT group_number, GROUP_CONCAT(rate ORDER BY c_id SEPARATOR ', ') AS rate_for_groups FROM ( SELECT DISTINCT group_number, c_id, rate FROM table_1 ) t1_distinct GROUP BY group_number ) t1_group ON t2.group_number = t1_group.group_number;
执行上述SQL后输出结果和你给出的期望结果完全匹配。
内容的提问来源于stack exchange,提问作者crazier
相关产品推荐
相关产品推荐

