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

求助编写符合特定薪资选择逻辑的SQL CASE语句

问题分析与解决方案

你的原查询存在两个关键问题:

  • NULL值判断逻辑错误:SQL里判断字段是否为NULL不能用=或<>,必须用IS NULL/IS NOT NULL,你写的[End Date]<>'NULL'和[End Date]= '#####'都是无效写法
  • 未实现跨记录关联逻辑:需求要求同一员工下,当Plan A的End Date非空时取该员工Plan B的薪资,但原查询仅处理当前行数据,没有关联同ID的Plan B记录

以下是两种符合需求的修正方案:

方案一:使用窗口函数(推荐)

通过窗口函数按ID分组,提前获取每个员工Plan B的薪资,再通过CASE语句完成逻辑判断:

SELECT 
    ID,
    [plan],
    [End Date],
    CASE
        -- Plan A且End Date非空时,取同ID的Plan B薪资
        WHEN [plan] = 'A' AND [End Date] IS NOT NULL THEN MAX(CASE WHEN [plan] = 'B' THEN Salary END) OVER (PARTITION BY ID)
        -- Plan A且End Date为空时,保留Plan A的薪资
        WHEN [plan] = 'A' AND [End Date] IS NULL THEN Salary
        -- 其他情况(如Plan B行)保留原薪资
        ELSE Salary
    END AS Updated_Salary
FROM YourTable; -- 替换为你的实际表名,避免使用关键字Table

方案二:使用自连接

通过自连接关联同ID的Plan B记录,再进行逻辑判断:

SELECT 
    t1.ID,
    t1.[plan],
    t1.[End Date],
    CASE
        WHEN t1.[plan] = 'A' AND t1.[End Date] IS NOT NULL THEN t2.Salary
        WHEN t1.[plan] = 'A' AND t1.[End Date] IS NULL THEN t1.Salary
        ELSE t1.Salary
    END AS Updated_Salary
FROM YourTable t1
LEFT JOIN YourTable t2 
    ON t1.ID = t2.ID AND t2.[plan] = 'B';

执行结果

两种方案都会输出符合需求的结果:

IDplanEnd DateUpdated_Salary
1001ANULL20000
1001BNULL300
1002A2023-04-31250
1002BNULL250

内容的提问来源于stack exchange,提问作者ramesh k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:01