关于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
相关产品推荐
相关产品推荐

