如何消除SQL分组查询中g.linkedline导致的多余结果?
解决SQL分组结果过多的问题
嘿,我完全懂你现在的困扰——明明只有2个产品,查出来却有20条结果,这肯定是分组维度出问题了!
问题根源
你当前的GROUP BY子句里包含了g.linkedline,这个字段应该是每条交易记录的唯一标识(或者同一个产品对应多个不同值),导致原本应该合并的itemcode + warehouse组合被拆分成了多个分组,结果条数自然就爆炸了。要解决这个问题,核心就是把g.linkedline从分组项里彻底移除。
修改后的查询语句
直接去掉GROUP BY中的g.linkedline,让聚合函数基于itemcode和warehouse这两个正确维度计算:
SELECT i.itemcode, g.warehouse, Sum(g.aantal) AS Voorraad, Max(CASE WHEN g.transtype = 'N' THEN g.sysmodified ELSE NULL END) AS LastDate FROM dbo.gbkmut AS g INNER JOIN dbo.items AS i ON g.artcode = i.itemcode AND g.reknr = i.glaccountdistribution AND ( g.transtype = 'N' OR ( g.transtype = 'B' AND g.transsubtype = 'B' AND g.freefield1 NOT IN ( 'B', 'Q', 'W', 'K' ) AND g.blockitem = '0' AND g.allocationtype = 'F' ) OR ( g.transtype = 'B' AND g.transsubtype = 'B' AND g.freefield1 = 'V' AND g.allocationtype = 'B' ) ) WHERE g.transtype = 'N' AND ( i.itemcode = 'TESTARTIKEL' OR i.itemcode = 'IQ7-60-2-INT' ) GROUP BY i.itemcode, g.warehouse -- 移除了g.linkedline,确保分组维度正确
额外提示
- 你当前的
WHERE子句里写了g.transtype = 'N',这会把JOIN条件里那些transtype = 'B'的记录全部过滤掉。如果你的意图是包含这些B类型交易来计算库存(Voorraad),那这个WHERE条件会导致计算结果不准确,得考虑移除它。 - 之前试的
TOP 1只会返回第一条结果,当然不符合你要获取所有产品聚合数据的需求;嵌套查询如果没调整分组维度,也没法解决重复分组的问题,所以聚焦修改分组项才是关键。
内容的提问来源于stack exchange,提问作者redouan
相关产品推荐
相关产品推荐

