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

关于invoicessales表两种HAVING过滤条件的差异及行数疑问

两个SQL查询条件的差异解析

这是个很典型的逻辑运算差异问题,咱们一步步拆解清楚:

核心逻辑差异:德摩根定律的应用

先把两个HAVING条件翻译成直白的逻辑语句,就能看出本质区别:

  • Query1的条件:ROUND(SUM(QtyInvoiced),1) <> 0 AND ROUND(SUM(Amount),1) <> 0
    → 等价于:必须同时满足「数量求和后四舍五入不为0」且「金额求和后四舍五入不为0」,才会保留这个分组
  • Query2的条件:NOT(ROUND(SUM(QtyInvoiced),1) = 0 AND ROUND(SUM(Amount),1) = 0)
    → 根据逻辑运算里的德摩根定律,这等价于:ROUND(SUM(QtyInvoiced),1) <> 0 OR ROUND(SUM(Amount),1) <> 0
    → 意思是:只要不同时满足「数量求和后四舍五入为0」且「金额求和后四舍五入为0」,就保留这个分组

具体场景对比

举几个实际分组的例子,就能直观看到区别:

  • 场景A:ROUND(SUM(QtyInvoiced),1)=0,ROUND(SUM(Amount),1)=150
    → Query1:因为数量的四舍五入结果是0,不满足AND的双重要求,所以被排除
    → Query2:因为不同时是0,所以被保留
  • 场景B:ROUND(SUM(QtyInvoiced),1)=20,ROUND(SUM(Amount),1)=0
    → 结果和场景A一致:Query1排除,Query2保留
  • 场景C:ROUND(SUM(QtyInvoiced),1)=0且ROUND(SUM(Amount),1)=0
    → 两个查询都会排除这个分组(完全符合你的需求)
  • 场景D:ROUND(SUM(QtyInvoiced),1)=30且ROUND(SUM(Amount),1)=200
    → 两个查询都会保留这个分组

为什么Query2行数更多?

Query2比Query1多出来的行数,就是上述场景A和场景B的分组——也就是那些「数量求和后四舍五入为0但金额不为0」,或者「金额求和后四舍五入为0但数量不为0」的分组。Query1额外把这些分组也排除了,但你的需求只是排除同时满足两个0的分组,所以Query2才是完全匹配你需求的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:13:22