我有一张表格如下:
ID Salary plan End Date
1001 20000 A NULL
1001 300 B NULL
1002 40000 A 2023-04-31
1002 250 B NULL
我的要求是,对于员工来说,如果 计划=A 和 [结束日期] <> NULL 那么Salary应该从Plan B中选择 计划=A 且[结束日期]=NULL 那么薪资应该从A计划中选择
我的查询如下所示,但没有成功。
select ID,[PLAN],[End Date],
case when [PLAN]='A'and [End Date]<> 'NULL'
then Cast(Null as Nvarchar(Max))
when PLAN='A'and [End Date]= '#####' then [Salary]
else [Salary]
END [Updated_Salary]
from Table
with your_table(ID,Salary,plann,End_Date)
as
(
select 1001, 20000, 'A', NULL union all
select 1001, 300, 'B', NULL union all
select 1002, 40000, 'A', '2023-04-30' union all
select 1002, 250, 'B' , NULL
)
select x.id,
case
when x.plann='A' and X.End_Date is not null then X.b_salary
when x.plann='A' and X.End_Date is null then X.Salary
end as Flagg
from
(
select a.id,a.Salary,a.plann,a.End_Date,
b.ID as b_id,b.Salary as b_salary,b.plann as b_plann,b.End_Date as b_end_date
from your_table as a
left join your_table as b on a.ID=b.ID and a.plann<>b.plann
)as x
无法确定要求,但可能类似的东西可以作为起点
虽然不清楚你想要的预期结果是什么。但我会尝试使用下面的查询来修复您的查询,以检查 [结束日期] 是否为空。
SELECT ID, [PLAN], [End Date],
CASE WHEN [PLAN]='A'AND [End Date] <> NULL
THEN null
WHEN PLAN='A'AND [End Date] = NULL
THEN [Salary]
ELSE [Salary]
END [Updated_Salary]
FROM SAMPLE;
基于 ID 和计划类型的自联接表,如果计划 A 类型结束日期不为空,则考虑 A 中的工资类型,否则考虑 B
declare @table table(
ID int ,
Salary decimal(18,2),
planType varchar(2),
EndDate dateTime
)
insert into @table
values (1001 , 20000 , 'A' , NULL),
(1001 , 300 ,'B' ,NULL),
(1002 , 40000 , 'A' , 2023-04-31),
(1002 , 250,'B' , NULL)
select t1.ID,case when t1.EndDate is not null then t2.Salary else t1.Salary end as Salary
from @table t1 join @table t2 on t1.ID=t2.ID and t1.planType='A' and t2.planType='B'
结果将是
身份证 | 薪资 |
---|---|
1001 | 20000 |
1002 | 250 |