Microsoft SQL查询:找出未包含Column C为Yes的重复记录分组
解决SQL查询:找出无'Yes'记录的分组
原查询的问题
你写的语句存在逻辑错误:WHERE Column C NOT IN (SELECT Column B ...) 是将Column C的取值('Yes'/'No')和Column B的取值(动物名称)做比对,类型与值完全不匹配,自然得不到正确结果。
正确解法
我们需要筛选出**Column B分组中不存在任何一行Column C='Yes'**的分组,并按要求格式输出。以下是两种可行方案:
方案1:GROUP BY + HAVING(推荐)
通过分组后筛选无'Yes'的分组,取每个分组的任意Column A(这里用最小值):
SELECT MIN(ColumnA) AS ColumnA, ColumnB, 'Missing Yes' AS ColumnC FROM t GROUP BY ColumnB HAVING MAX(CASE WHEN ColumnC = 'Yes' THEN 1 ELSE 0 END) = 0;
逻辑说明:
CASE WHEN ColumnC = 'Yes' THEN 1 ELSE 0 END:将分组内的'Yes'标记为1,其他为0MAX(...) = 0:表示该分组中没有任何'Yes'记录MIN(ColumnA):取分组内最小的Column A,你也可以根据需求换成MAX(ColumnA)或其他取值
方案2:NOT EXISTS
通过子查询检查分组是否存在'Yes'记录,排除存在的分组:
SELECT MIN(t1.ColumnA) AS ColumnA, t1.ColumnB, 'Missing Yes' AS ColumnC FROM t t1 WHERE NOT EXISTS ( SELECT 1 FROM t t2 WHERE t2.ColumnB = t1.ColumnB AND t2.ColumnC = 'Yes' ) GROUP BY t1.ColumnB;
逻辑说明:
NOT EXISTS子查询检查当前Column B分组下是否有'Yes'记录,无则保留- 同样通过
MIN(ColumnA)取分组内的任意Column A值
结果验证
执行上述语句后,会得到符合需求的输出:
| ColumnA | ColumnB | ColumnC |
|---|---|---|
| 1 | Cat | Missing Yes |
| 6 | Fox | Missing Yes |
(注:你的期望输出中Fox的ColumnA为2是笔误,原数据中Fox的ColumnA为6和7,上述查询取最小值6,若需指定其他值可调整聚合函数)
内容的提问来源于stack exchange,提问作者finfam
相关产品推荐
相关产品推荐

