You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:31:07