DAX编写列重复值识别公式时提示文本无法转数字类型错误
错误产生原因
公式报错的核心原因是条件判断处的符号误用:
- 你在FILTER函数的筛选条件里写了
EARLIER('EnergyRoster'[NameID])-'EnergyRoster'[NameID],其中-是DAX的数值减法运算符,执行时会强制尝试把运算符两侧的值转换为数值类型做减法计算。 - 但你的
NameID列存储的是JorgeCordon这类文本值,无法转换为数字,因此直接触发类型转换错误。 - 从需求反推,你本意是要判断当前行的NameID和遍历行的NameID是否相等,应该用等号
=做逻辑判断,而非减号-做数值计算。
正确DAX写法
根据不同使用场景,可以选以下几种写法:
1. 沿用原有思路的修正版(统计重复次数)
把减号替换为等号即可,逻辑是逐行遍历全表,统计和当前行NameID一致的总行数:返回值=1为无重复,返回值>1为重复值,数值代表该NameID总共出现的次数。
Unique_Ctr = COUNTROWS( FILTER( 'EnergyRoster', EARLIER('EnergyRoster'[NameID]) = 'EnergyRoster'[NameID] ) )
2. 高可读性版本(变量替代EARLIER)
用变量存储当前行的NameID,避免EARLIER的行上下文嵌套带来的理解成本,写错概率更低:
Unique_Ctr = VAR CurrID = 'EnergyRoster'[NameID] RETURN COUNTROWS( FILTER( 'EnergyRoster', 'EnergyRoster'[NameID] = CurrID ) )
3. 高性能版本(适合大数据量表)
用ALLEXCEPT函数调整筛选上下文,不需要逐行遍历全表做判断,数据量越大计算速度优势越明显,返回结果和前两种写法完全一致:
Unique_Ctr = CALCULATE( COUNTROWS('EnergyRoster'), ALLEXCEPT('EnergyRoster', 'EnergyRoster'[NameID]) )
4. 重复值标记版本(仅判断是否重复)
如果不需要统计具体重复次数,只需要标记哪些行是重复值,可以直接返回布尔结果:
Is_Duplicate = VAR CurrID = 'EnergyRoster'[NameID] RETURN COUNTROWS(FILTER('EnergyRoster', 'EnergyRoster'[NameID] = CurrID)) > 1
返回TRUE代表该行NameID存在重复,返回FALSE代表是唯一值。
内容的提问来源于stack exchange,提问作者Jim Mysliwiec
相关产品推荐
相关产品推荐

