Oracle SQL合并相同ID行并汇总对应数据列的实现方法
问题根因
你的写法存在三个核心错误,和listagg本身功能无关:
- 语法错误:
from table a,末尾多写了逗号,会直接触发SQL语法报错。 - 逻辑错误:使用聚合函数时未写
GROUP BY分组规则,数据库会默认将所有非聚合列作为分组维度,你保留了b.name字段,同一个ID对应Name1、name1两个不同值,会被拆成两个独立分组,聚合计算只会在单组内生效,无法跨同ID记录汇总。 - 函数误用:
listagg的作用是将分组内的多个值拼接为字符串,你的需求是每个ID只返回单个ID值,完全不需要使用这个函数。
正确SQL写法
按date、id维度分组,对三个数值列求和,姓名字段取分组内任意一个匹配值即可,写法如下:
select a.date, a.id, max(b.name) as name, sum(a.data1) as data1, sum(a.data2) as data2, sum(a.data3) as data3 from table a inner join table b on a.id = b.id group by a.date, a.id
逻辑说明
- 分组后同一个
date+id的记录会合并为单行,不会出现重复ID - 三个数值字段会自动按分组累加,和你预期的汇总结果完全一致:ID为12345的记录data1=10+15=25、data2=5+3=8、data3=5+2=7
- 用
max(b.name)会取分组内字符序最靠前的name值,你示例中大写开头的Name1字符序优先于小写开头的name1,刚好返回你期望的姓名结果。如果需要指定取特定规则的name(比如最新录入的、指定大小写的),可以先对b表做去重处理再关联,或调整聚合逻辑。
你之前用listagg出现ID重复拼接、数值不汇总的问题,本质就是缺少GROUP BY导致分组粒度不对,和函数本身用法无关。
内容的提问来源于stack exchange,提问作者Aidas Dem
相关产品推荐
相关产品推荐

