求助编写符合特定薪资选择逻辑的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';
执行结果
两种方案都会输出符合需求的结果:
| ID | plan | End Date | Updated_Salary |
|---|---|---|---|
| 1001 | A | NULL | 20000 |
| 1001 | B | NULL | 300 |
| 1002 | A | 2023-04-31 | 250 |
| 1002 | B | NULL | 250 |
内容的提问来源于stack exchange,提问作者ramesh k
相关产品推荐
相关产品推荐

