嵌套IF ELSE子查询问题:员工培训异常计数计算错误排查
Tableau异常员工统计计算字段错误分析与修正
需求回顾
需要统计满足以下任一条件的唯一员工数量:
- 员工2023年的
test attribute为E1/E2(对应培训状态为overdue/late completion) - 员工2021/2022年的
test attribute为E1(对应培训状态为overdue)
样本数据中正确结果为3人(Henry、Sam、Tom),Mike因2023年无符合条件的记录不计入。
原公式的问题
你编写的计算字段公式存在4个核心错误:
If ([test attribute] IN ('e1', 'e2') and year([assigned date]) = 2023) and if [test attribute] = 'e1' and year([assigned date]) IN (2022, 2021) then 1 else 0 end;
逻辑运算符完全错误
需求是满足任一条件即可计入,但公式用了and(逻辑与),要求两个条件同时满足,只有既在2023年有E1/E2,又在2021/2022年有E1的员工才会被计数,完全违背需求逻辑。IF语法不合法
Tableau的IF函数语法为IF 条件 THEN 结果 ELSE 结果 END,原公式嵌套的IF没有正确闭合,属于语法错误,会导致计算失败。大小写不匹配
样本数据中test attribute的值为大写E1/E2,但公式中用了小写e1/e2,Tableau默认区分大小写,会导致匹配失败(比如Henry的E1不会被识别为e1)。未处理员工去重
每个员工有多条记录,原公式会给每条符合条件的记录标记1,直接计数会得到重复的员工数,而你需要的是唯一员工数量,不是符合条件的记录数。
修正后的解决方案
方法一:分步计算
1. 创建是否异常记录计算字段
先标记单条记录是否符合异常条件,统一大小写避免匹配问题:
IF (LOWER([test attribute]) IN ('e1', 'e2') AND YEAR([assigned date]) = 2023) OR (LOWER([test attribute]) = 'e1' AND YEAR([assigned date]) IN (2021, 2022)) THEN 1 ELSE 0 END
2. 创建异常员工数计算字段
通过固定员工ID和姓名,取最大值来标记员工是否异常,再统计唯一员工数:
COUNTD(IF { FIXED [id], [name] : MAX([是否异常记录]) } = 1 THEN [id] END)
方法二:单字段直接计算
合并逻辑,直接统计符合条件的唯一员工ID:
COUNTD( IF (LOWER([test attribute]) IN ('e1', 'e2') AND YEAR([assigned date]) = 2023) OR (LOWER([test attribute]) = 'e1' AND YEAR([assigned date]) IN (2021, 2022)) THEN [id] END )
针对样本排除Mike的调整
如果需要严格匹配样本结果(排除Mike),说明规则实际为:员工2023年有E1/E2记录,或者员工2021/2022年有E1记录且2023年无任何记录,则公式调整为:
COUNTD( IF (LOWER([test attribute]) IN ('e1', 'e2') AND YEAR([assigned date]) = 2023) OR (LOWER([test attribute]) = 'e1' AND YEAR([assigned date]) IN (2021, 2022) AND { FIXED [id] : MAX(YEAR([assigned date])) } < 2023) THEN [id] END )
内容的提问来源于stack exchange,提问作者User277883
相关产品推荐
相关产品推荐

