满足全局B/C/D为0且含A=1的Distinct ID统计问题求解
问题分析
你原来的SQL只筛选了单条记录满足A=1且B/C/D=0的ID,但没有验证该ID的所有记录是否都符合B/C/D=0的要求,所以ID2被错误统计了——虽然它有两条符合A=1且B/C/D=0的记录,但存在一条B=1的记录,完全不符合条件。
正确解决方案
方法1:GROUP BY + HAVING(逻辑清晰,推荐)
通过分组后聚合判断,确保ID同时满足两个核心条件:
- 至少有一条记录
A=1(用MAX(A)=1验证,只要有一条A=1,最大值就是1) - 所有记录的
B/C/D都是0(用MAX(B/C/D)=0验证,只要有一条记录不为0,最大值就会大于0)
SELECT COUNT(ID) FROM tab GROUP BY ID HAVING MAX(A) = 1 AND MAX(B) = 0 AND MAX(C) = 0 AND MAX(D) = 0;
这里不用COUNT(DISTINCT ID)是因为GROUP BY ID已经按ID分组,每个ID只返回一行,直接COUNT即可。
方法2:NOT EXISTS 子查询
先找出所有有A=1的ID,再排除那些存在B/C/D不为0记录的ID:
SELECT COUNT(DISTINCT t1.ID) FROM tab t1 WHERE t1.A = 1 AND NOT EXISTS ( SELECT 1 FROM tab t2 WHERE t2.ID = t1.ID AND (t2.B <> 0 OR t2.C <> 0 OR t2.D <> 0) );
子查询会检查当前ID是否存在任何不符合B/C/D=0的记录,存在则直接排除该ID。
验证结果
两种方法都会返回0,符合预期——ID1有D=1的记录,ID2有B=1的记录,都不满足条件。
内容的提问来源于stack exchange,提问作者geek45
相关产品推荐
相关产品推荐

