如何正确编写Oracle SQL实现按PNTO_VNTA分组拼接CARGO字段值
问题原因
- 你当前的SQL存在两个错误导致输出不符合预期:
GROUP BY子句中加入了g.cargo字段,会按每个不同的CARGO值分组生成单独行,无法把所有匹配的CARGO合并到同一行展示- LISTAGG语法使用错误,分隔符需要放在LISTAGG的参数括号内,且不需要加
OVER()开窗子句,直接用聚合形式的LISTAGG即可
修正后的SQL代码
SELECT s.PNTO_VNTA, LISTAGG(g.CARGO, ', ') WITHIN GROUP (ORDER BY g.CARGO) AS PRODUCTOS FROM PNTOS_VNTA s, CARGOS g WHERE s.crgo = g.CARGO AND s.PNTO_VNTA = 12345 GROUP BY s.PNTO_VNTA;
补充说明
如果你的Oracle版本是19c及以上,担心拼接的内容过长触发长度超限报错,可以加ON OVERFLOW TRUNCATE参数处理溢出场景,写法为LISTAGG(g.CARGO, ', ' ON OVERFLOW TRUNCATE '...' WITHOUT COUNT) WITHIN GROUP (ORDER BY g.CARGO)
内容的提问来源于stack exchange,提问作者Stiven Medina
相关产品推荐
相关产品推荐

