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

Oracle多表列分组计算问题:重复行合并求和需求

解决Oracle分组求和重复行问题

嘿,我一眼就看出你查询里的问题了——重复行是因为分组维度不对,再加上缺少表关联条件导致的笛卡尔积,这俩问题凑一起就把你的求和结果拆得七零八落了。

问题分析

你原查询的GROUP BY子句里包含了I.ROLL_QTY和I.QUALITY,这就等于告诉Oracle:只要这两个列的值不一样,就算是不同的分组。所以同一个quality和roll_size下,只要rolls_issue里有不同的ROLL_QTY记录,就会被拆成多行。另外,你用的是隐式JOIN却没加关联条件,rolls和rolls_issue会做笛卡尔积,这也会导致数据重复计算。

修正后的SQL语句

我给你调整了查询逻辑,用显式LEFT JOIN保证关联正确性,同时只保留必要的分组维度:

SELECT 
    x.quality,
    x.roll_size,
    SUM(x.roll_qty) AS "TOTAL_ROLL",
    NVL(SUM(I.ROLL_QTY), 0) AS "USED"
FROM rolls x
LEFT JOIN rolls_issue I 
    ON x.quality = I.quality 
    -- 注意:这里可能需要补充更多关联条件,比如roll_id/roll_code
    -- 确保是同一条卷材的采购和发放记录关联,避免跨卷材错误求和
WHERE x.quality IS NOT NULL
GROUP BY x.quality, x.roll_size;

关键调整点

  1. 显式关联+正确JOIN条件:用LEFT JOIN替代隐式逗号分隔的JOIN,并且加上x.quality = I.quality(如果你的表有唯一标识卷材的字段,比如roll_id,一定要加上这个条件,否则同一quality下的不同卷材会被错误关联,导致求和不准)。
  2. 精简分组维度:GROUP BY只保留你需要聚合的维度x.quality和x.roll_size,这样相同这两个值的所有行都会被合并成一组,SUM时自动把对应数量加总。
  3. NVL处理空值:保证没有发放记录的卷材,USED列显示0而不是NULL,符合你的统计需求。

这样调整后,你说的FLOUTING 100 GSM就会把两次发放的40和20求和成60,合并成唯一的一行分组结果。

内容的提问来源于stack exchange,提问作者ali_codex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:29:35