SQL查询求助:筛选仅含Pass结果的Serial字段
解决思路与正确SQL写法
你的原SQL逻辑存在问题:先通过WHERE Result='pass'过滤掉了所有Fail的行,此时分组后无法判断该Serial是否存在Fail记录,所以A1、A5这类同时有Pass和Fail的Serial仍会被选中。
要实现只筛选出仅包含Pass结果的Serial,核心是先排除所有存在Fail记录的Serial,再查询这些Serial的Pass结果,以下是几种可行的写法:
方法1:子查询排除含Fail的Serial
SELECT Serial, Result FROM tbl_Result WHERE Serial NOT IN ( -- 先找出所有存在Fail结果的Serial SELECT Serial FROM tbl_Result WHERE Result = 'fail' ) AND Result = 'pass';
方法2:分组验证无Fail记录
通过分组统计每个Serial的Fail数量,确保为0后再关联原表获取Pass记录:
SELECT r.Serial, r.Result FROM tbl_Result r INNER JOIN ( SELECT Serial FROM tbl_Result GROUP BY Serial -- 统计Fail的数量,等于0说明该Serial没有Fail记录 HAVING COUNT(CASE WHEN Result = 'fail' THEN 1 END) = 0 ) s ON r.Serial = s.Serial WHERE r.Result = 'pass';
方法3:直接分组筛选
如果你的场景中每个Serial的Pass记录可能有多条,且只需保留Serial和Result(固定为Pass),也可以用这种写法:
SELECT Serial, Result FROM tbl_Result GROUP BY Serial, Result HAVING Result = 'pass' -- 确保该Serial只有一种Result(即Pass) AND COUNT(DISTINCT Result) = 1;
以上写法都能排除A1、A5这类同时存在Pass和Fail的Serial,得到你预期的8条记录。
内容的提问来源于stack exchange,提问作者Lim
相关产品推荐
相关产品推荐

