带有嵌套 if else 条件的子查询

问题描述 投票:0回答:1

我有以下 3 列定义每个员工的培训状态。计算的列是;

  1. 2023 年的培训状态计算方式为:[测试属性] = 'e1' 且年份([指定日期])= 2023,则“逾期” elseif [测试属性] = 'e2' 且年份([指定日期])= 2023 then '延迟完成' else '' 结束;

  2. 2022 年的培训状态计算方式为:[测试属性] = 'e1',年份([指定日期])= 2022,然后'逾期';

  3. 2021 年的培训状态计算方式为:[测试属性] = 'e1',年份([指定日期])= 2021,然后'逾期';

我想根据以下条件获取例外计数 - 如果 2023 年的培训状态 = e1 或 e2,则从该人群中,如果 2021 年的培训状态或 2022 年的培训状态 = e1,则将此类 id 计为例外。在下面的示例数据中,例外计数应为 = 3(Henry、Sam 和 Tom)我们不计算 Mike,因为他在 2023 年的训练状态既不是 e1 也不是 e2。

id 名字 训练状况 指定日期 类型
102 亨利 E1 2023-05-01 比较
102 亨利 E1 2022-01-30 比较
102 亨利 E2 2023-05-01 比较
101 迈克 X 2023-10-21 其他
101 迈克 E1 2023-06-19 其他
100 山姆 E2 2023-11-12 比较
100 山姆 E1 2023-09-18 其他
100 山姆 E1 2023-11-12 其他
103 汤姆 X 2023-11-12 其他
103 汤姆 E1 2023-09-18 比较
103 汤姆 E2 2023-11-12 比较

有办法做我正在寻找的事情吗?

我尝试了以下计算,但它没有给我准确的计数

If ([测试属性] IN ('e1', 'e2') 和年份([指定日期]) = 2023) and if [测试属性] = 'e1' 和年份([指定日期]) IN (2022, 2021) 然后 1 else 0 结束;

sql sql-server if-statement nested subquery
1个回答
0
投票

SQL 使用“case 表达式”而不是 if/else 语法(尽管您可以在 T-SQL 中使用 if/else),但如果使用 SQL,您可能应该习惯 case 表达式的语法。语法与您声明的要求非常相似,例如:

select
    ...
    , case
        when [test attribute] = 'e1' and year([assigned date]) = 2023 then 'overdue' 
        when [test attribute] = 'e2' and year([assigned date]) = 2023 then 'late completion' 
        else '' 
     end as calc1
    , case
        when [test attribute] = 'e1' and year([assigned date]) < 2023 then 'overdue' 
     end as calc2
from your_tables

注意:case 表达式“从上到下”开始,因此如果第一个“when”为 true,它将忽略任何后续的“when”或“else”条件,如果第一个为 false,则它将评估下一个“when”,依此类推直到完成(所以它不需要“elseif”但可以实现等效)。

小点:虽然正确的术语是“case 表达式”,但您会遗憾地发现许多对“case 语句”的引用。

© www.soinside.com 2019 - 2024. All rights reserved.