基于指定列值拼接单元格内容 LISTAGG函数正确使用方法求助
原SQL问题排查
原SQL存在以下语法和逻辑错误:
- 字段后缺逗号:
AA.REMARKS_SEQ_NBR字段后没有加逗号,属于基础语法错误 - 字段引用错误:
LISTAGG函数内的REMARK_TEXTS被单引号包裹,会被识别为固定字符串而非表字段,需去掉单引号 LISTAGG语法错误:WITHIN GROUP子句后必须跟排序规则,你需要按REMARKS_SEQ_NBR顺序拼接,此处应写ORDER BY REMARKS_SEQ_NBR而非填写分组字段- 分组规则错误:
GROUP BY只声明了ID_NUMBER,但SELECT子句中选取的LAST_NAME、FIRST_NM、DATE_OF_BIRTH、CUSTOMER_SINCE都不属于聚合字段,要么加入GROUP BY列表,要么用聚合函数包裹。如果同一个ID_NUMBER对应的这些字段值都唯一,直接加入GROUP BY即可 - 冗余关键字:
GROUP BY后结果天然去重,不需要额外加DISTINCT关键字 - 字段逻辑问题:如果你是要合并同一个用户的所有备注,不需要把
REMARKS_SEQ_NBR放到最终查询结果里,否则同一个用户会因为序号不同拆成多行,无法合并
修正后SQL
SELECT ID_NUMBER, LAST_NAME, FIRST_NM, DATE_OF_BIRTH, CUSTOMER_SINCE, -- 按备注序号升序拼接备注内容,用分号+空格作为分隔符,可按需调整 LISTAGG(REMARK_TEXTS, '; ') WITHIN GROUP (ORDER BY REMARKS_SEQ_NBR) AS ALL_REMARKS FROM CUSTOMER_CURRENT -- 同一个用户的非备注字段值唯一的情况下,按这些字段分组即可 GROUP BY ID_NUMBER, LAST_NAME, FIRST_NM, DATE_OF_BIRTH, CUSTOMER_SINCE ORDER BY ID_NUMBER;
如果使用Oracle等支持溢出处理的数据库,可以添加溢出截断逻辑避免拼接内容过长报错,示例:LISTAGG(REMARK_TEXTS, '; ' ON OVERFLOW TRUNCATE '...') WITHIN GROUP (ORDER BY REMARKS_SEQ_NBR)
内容的提问来源于stack exchange,提问作者SQLPhan
相关产品推荐
相关产品推荐

