You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Case When表达式输出不符合预期,求SQL多行列判断解决方案

解决方案

你的原SQL逻辑完全偏离需求——你用CaseFunction= '1' and CaseFunction = '2'作为判断条件,这本身不可能成立(一个字段无法同时等于两个不同值),而且完全没用到status字段,自然得不到预期结果。

要实现需求,核心是对每个ID判断是否同时满足两个条件:

  1. 该ID下存在status = 'cancelled'的行
  2. 该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:12:13