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;
关键调整点
- 显式关联+正确JOIN条件:用
LEFT JOIN替代隐式逗号分隔的JOIN,并且加上x.quality = I.quality(如果你的表有唯一标识卷材的字段,比如roll_id,一定要加上这个条件,否则同一quality下的不同卷材会被错误关联,导致求和不准)。 - 精简分组维度:
GROUP BY只保留你需要聚合的维度x.quality和x.roll_size,这样相同这两个值的所有行都会被合并成一组,SUM时自动把对应数量加总。 - NVL处理空值:保证没有发放记录的卷材,
USED列显示0而不是NULL,符合你的统计需求。
这样调整后,你说的FLOUTING 100 GSM就会把两次发放的40和20求和成60,合并成唯一的一行分组结果。
内容的提问来源于stack exchange,提问作者ali_codex
相关产品推荐
相关产品推荐

