如何在SQL中不使用GROUP BY/HAVING函数实现数据过滤
解决方案
核心问题原因
你把行级过滤规则错放在了HAVING子句中:HAVING是对GROUP BY分组聚合后的结果进行过滤,所以其中用到的非聚合字段必须属于分组字段;而排除特定客户、筛选单据类型、筛选商品编码都属于分组前的行级过滤规则,应该放在WHERE子句中执行,不需要加入分组字段。
优化后查询语句
SELECT SL.[Item No_], SUM(SL.[Outstanding Quantity]) AS OutstandingTotalQuantity FROM [Database$Sales Header] SH LEFT JOIN [Database$Sales Line] SL ON SL.[Document No_] = SH.[No_] LEFT JOIN [Database$Items] I ON I.[No_] = SL.[Item No_] -- 所有行级过滤规则提前到WHERE,分组前执行 WHERE SH.[Document Type] = '1' AND I.[Product Code] = 'SHIRT' AND SH.[Customer No_] <> 'CUST1' -- 仅保留需要的分组字段,不需要额外加过滤用的字段 GROUP BY SL.[Item No_] ORDER BY SL.[Item No_]
额外优化说明
原语句GROUP BY中额外携带的SH.[Document Type]、I.[Product Code]也可以直接移除:这两个字段已经在WHERE中固定了筛选值,不需要参与分组逻辑,移除后不会影响统计结果,还能避免不必要的分组维度带来的重复行问题。
内容的提问来源于stack exchange,提问作者adhocEY
相关产品推荐
相关产品推荐

