Case When表达式输出不符合预期,求SQL多行列判断解决方案
解决方案
你的原SQL逻辑完全偏离需求——你用CaseFunction= '1' and CaseFunction = '2'作为判断条件,这本身不可能成立(一个字段无法同时等于两个不同值),而且完全没用到status字段,自然得不到预期结果。
要实现需求,核心是对每个ID判断是否同时满足两个条件:
- 该ID下存在
status = 'cancelled'的行 - 该ID下存在其他行的
status为NULL或changed
下面提供两种可行的SQL写法:
方法一:窗口函数(推荐,无需额外子查询)
SELECT ID, Status, CaseFunction, CASE WHEN -- 统计当前ID下cancelled行的数量,大于0说明存在 COUNT(CASE WHEN Status = 'cancelled' THEN 1 END) OVER(PARTITION BY ID) > 0 AND -- 统计当前ID下status为NULL或changed的行数量,大于0说明存在 COUNT(CASE WHEN Status IS NULL OR Status = 'changed' THEN 1 END) OVER(PARTITION BY ID) > 0 THEN 2 ELSE 1 END AS RequiredOutput FROM #dat
方法二:子查询+关联
先通过子查询筛选出符合条件的ID,再关联原表判断输出:
WITH qualifying_ids AS ( SELECT ID FROM #dat GROUP BY ID HAVING -- 存在cancelled行 SUM(CASE WHEN Status = 'cancelled' THEN 1 ELSE 0 END) > 0 AND -- 存在NULL或changed的行 SUM(CASE WHEN Status IS NULL OR Status = 'changed' THEN 1 ELSE 0 END) > 0 ) SELECT d.ID, d.Status, d.CaseFunction, CASE WHEN q.ID IS NOT NULL THEN 2 ELSE 1 END AS RequiredOutput FROM #dat d LEFT JOIN qualifying_ids q ON d.ID = q.ID
两种方法都会对每个ID的所有行统一输出2或1,完全符合你的需求。
内容的提问来源于stack exchange,提问作者LearnTech
相关产品推荐
相关产品推荐

