求助SQL查询语句:筛选所有对应Col3均为'Y'的Col1值
解决方案:筛选Col3全为'Y'的Col1记录
首先先把你提供的原始数据整理出来,方便参考:
Col1;Col2;Col3 12345;01;Y 12345;02;Y 12345;03;Y 22222;01;Y 22222;02;Y 22222;03;N 33333;01;N 44444;01;Y
你的需求是找出所有**对应Col3记录全部为'Y'**的Col1值,也就是排除那些存在至少一条Col3为'N'的Col1。下面提供几种常用的实现方式:
方法1:GROUP BY + HAVING(最简洁直观)
这是处理这类“全满足”需求的经典写法,通过分组后过滤条件实现:
SELECT Col1 FROM your_table_name GROUP BY Col1 HAVING COUNT(CASE WHEN Col3 != 'Y' THEN 1 END) = 0;
逻辑说明:
GROUP BY Col1将相同Col1的所有记录归为一组COUNT(CASE WHEN Col3 != 'Y' THEN 1 END)统计每组中Col3不为'Y'的记录数量HAVING子句只保留统计数为0的分组,也就是该Col1下没有非'Y'的记录
你也可以利用字符排序特性简化写法(因为'Y'的ASCII码比'N'大):
SELECT Col1 FROM your_table_name GROUP BY Col1 HAVING MIN(Col3) = 'Y' AND MAX(Col3) = 'Y';
如果一组里的Col3全是'Y',那么最小值和最大值都会是'Y',反之只要有一个'N',最小值就会是'N'。
方法2:NOT EXISTS 子查询
这种写法逻辑更直白:找出那些**不存在同Col1且Col3为'N'**的记录:
SELECT DISTINCT Col1 FROM your_table_name t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.Col1 = t1.Col1 AND t2.Col3 = 'N' );
逻辑说明:
- 外层查询遍历每条记录,子查询检查当前Col1是否存在Col3为'N'的记录
NOT EXISTS表示如果子查询找不到匹配的记录,就保留当前Col1DISTINCT用来去重,因为同一个Col1会有多条记录
方法3:窗口函数(适合复杂场景扩展)
如果后续需要更多关联逻辑,可以用窗口函数先标记每个Col1是否包含'N',再筛选:
WITH cte AS ( SELECT Col1, MAX(CASE WHEN Col3 = 'N' THEN 1 ELSE 0 END) OVER (PARTITION BY Col1) AS has_n FROM your_table_name ) SELECT DISTINCT Col1 FROM cte WHERE has_n = 0;
逻辑说明:
- 用CTE(公共表表达式)给每个Col1添加一个
has_n标记:如果该Col1存在'N',标记为1,否则为0 - 最后筛选出
has_n为0的Col1值
以上三种方法都能得到你想要的结果:12345和44444。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

