我有以下 3 列定义每个员工的培训状态。计算的列是;
2023 年的培训状态计算方式为:[测试属性] = 'e1' 且年份([指定日期])= 2023,则“逾期” elseif [测试属性] = 'e2' 且年份([指定日期])= 2023 then '延迟完成' else '' 结束;
2022 年的培训状态计算方式为:[测试属性] = 'e1',年份([指定日期])= 2022,然后'逾期';
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 使用“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 语句”的引用。