DAX使用LOOKUPVALUE返回多值错误,如何填充全表Measure_id字段
DAX多匹配场景下填充Measure_ID的实现方案
错误原因说明
LOOKUPVALUE函数要求返回唯一值,当同一筛选条件下匹配到多条数据时,就会触发A table of multiple values was supplied where a single value was expected报错。
需求规则梳理
从示例数据可以得出填充规则:每个Group_ID对应的Measure_ID等于该分组下Desc为open的行对应的ID值,同分组下所有行统一填充该值。
实现方案
可以实现类似Excel的INDEX+MATCH逻辑,以下是两种常用的计算列实现方式:
方案1:CALCULATE+聚合函数组合(最简写法)
Measure_ID = CALCULATE ( MAX ( '你的表名'[ID] ), ALLEXCEPT ( '你的表名', '你的表名'[Group_ID] ), '你的表名'[Desc] = "open" )
说明:ALLEXCEPT保留当前行的Group_ID筛选上下文,筛选出同分组下Desc为open的行,用MAX聚合保证返回唯一值,避免多匹配报错。如果确认每个分组下只有1条Desc=open的行,也可以将MAX替换为VALUES。
方案2:模拟Excel INDEX+MATCH逻辑
Measure_ID = VAR CurrentGroup = '你的表名'[Group_ID] // 匹配同分组下Desc为open的所有行,对应Excel的MATCH逻辑 VAR MatchRows = FILTER ( ALL ( '你的表名' ), '你的表名'[Group_ID] = CurrentGroup && '你的表名'[Desc] = "open" ) // 取第一条匹配结果的ID值,对应Excel的INDEX逻辑 RETURN SELECTCOLUMNS ( TOPN ( 1, MatchRows, '你的表名'[ID] ), "MeasureID", [ID] )
说明:该写法逻辑和Excel INDEX+MATCH完全一致,TOPN(1)会取匹配到的第一条结果,即使存在多匹配场景也不会报错。
注意事项
- 以上均为计算列写法,如果需要实现度量值,调整上下文筛选规则即可
- 如果存在同一个
Group_ID下有多个不同ID的open行,可根据实际需求调整聚合逻辑,比如按时间排序取最早/最晚的ID值
内容的提问来源于stack exchange,提问作者John M
相关产品推荐
相关产品推荐

