如何仅返回所有同Docnum记录Qty均非零的单条记录?
解决方案:筛选所有Qty均不为0的Docnum
嘿,这个需求很典型,我给你分享几种实用的SQL写法,都能精准得到你想要的Docnum 220和222:
方法一:使用NOT EXISTS子查询
这是最常用也最直观的写法之一,核心思路是找出不存在任何Qty=0记录的Docnum:
SELECT DISTINCT Docnum FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Docnum = t1.Docnum AND t2.Qty = 0 );
DISTINCT用来去重,确保每个Docnum只返回一次NOT EXISTS会针对每个Docnum检查:有没有属于它的Qty=0的记录?没有的话就保留这个Docnum
方法二:GROUP BY + HAVING筛选
通过分组统计来排除包含Qty=0的Docnum:
SELECT Docnum FROM your_table GROUP BY Docnum HAVING SUM(CASE WHEN Qty = 0 THEN 1 ELSE 0 END) = 0;
- 按
Docnum分组后,用CASE语句统计每个组里Qty=0的记录数 HAVING SUM(...) = 0表示这个组里没有任何Qty=0的记录,符合要求- 这种写法不需要
DISTINCT,因为GROUP BY本身就会返回唯一的Docnum值
方法三:使用EXCEPT(部分数据库支持)
如果你的数据库支持EXCEPT关键字(比如SQL Server、PostgreSQL、MySQL 8.0+等),可以用集合差来实现:
SELECT DISTINCT Docnum FROM your_table EXCEPT SELECT DISTINCT Docnum FROM your_table WHERE Qty = 0;
- 先获取所有存在的Docnum,再减去那些包含Qty=0的Docnum,剩下的就是符合条件的结果
小提示
- 如果你的
Qty字段可能出现负数,不要用HAVING MIN(Qty) > 0,因为负数虽然不为0,但MIN会小于0,会误判 - 给
Docnum和Qty字段建立索引的话,能大幅提升这些查询的性能
内容的提问来源于stack exchange,提问作者A. Ascanio
相关产品推荐
相关产品推荐

