Power BI中DAX LOOKUPVALUE函数类型不匹配报错问题求助
首先,咱们先搞清楚你报错的根源:你用错了LOOKUPVALUE的语法结构。
LOOKUPVALUE的标准语法是:
LOOKUPVALUE(<结果列>, <查找列1>, <匹配值1>, <查找列2>, <匹配值2>, ...)
你之前的写法里,把EXAM_REPORT[CES EXAM.EXAM_TYPE_SR_KEY] = 2这种筛选表达式直接当成了<匹配值1>,这会让DAX把这个布尔表达式的结果(True/False)和查找列的数字类型(EXAM_TYPE_SR_KEY是数字)做比较,自然就触发了“数字和布尔值无法比较”的错误。
而且第二个条件ISBLANK(EXAM_REPORT[CES EXAM.EXAM_SIGNOFF_DATE]) = FALSE也没法直接用在LOOKUPVALUE里——LOOKUPVALUE是做精确值匹配,不是筛选条件,它不能直接判断“列是否非空”。
推荐的正确写法(更适合取最新值)
既然你要获取的是符合条件的最新实际考试日期,用CALCULATE结合MAX或者LASTDATE会更可靠(还能避免LOOKUPVALUE在多匹配结果时报错的问题):
Latest Detailed = CALCULATE ( MAX(EXAM_REPORT[ACTUAL_EXAM_DATE]), // MAX会返回最大的日期,也就是最新的 // 以下是筛选条件,和你需求完全对应 EXAM_REPORT[CES EXAM.EXAM_TYPE_SR_KEY] = 2, NOT(ISBLANK(EXAM_REPORT[CES EXAM.EXAM_SIGNOFF_DATE])), EXAM_REPORT[ASSET_GUID] = [ASSET_GUID] )
或者用LASTDATE(效果和MAX一致,语义更明确表示“最新日期”):
Latest Detailed = CALCULATE ( LASTDATE(EXAM_REPORT[ACTUAL_EXAM_DATE]), EXAM_REPORT[CES EXAM.EXAM_TYPE_SR_KEY] = 2, NOT(ISBLANK(EXAM_REPORT[CES EXAM.EXAM_SIGNOFF_DATE])), EXAM_REPORT[ASSET_GUID] = [ASSET_GUID] )
如果一定要用LOOKUPVALUE(需确保匹配结果唯一)
如果你坚持要用LOOKUPVALUE,得先确保每个ASSET_GUID只有一条符合条件的记录(否则LOOKUPVALUE会报错),正确的语法应该是把每个筛选条件拆成“查找列+具体匹配值”,但对于“签退日期非空”这个条件,我们得换个方式(比如先过滤行):
Latest Detailed = VAR FilteredRows = FILTER( EXAM_REPORT, EXAM_REPORT[CES EXAM.EXAM_TYPE_SR_KEY] = 2 && NOT(ISBLANK(EXAM_REPORT[CES EXAM.EXAM_SIGNOFF_DATE])) && EXAM_REPORT[ASSET_GUID] = [ASSET_GUID] ) RETURN LOOKUPVALUE( EXAM_REPORT[ACTUAL_EXAM_DATE], EXAM_REPORT[ASSET_GUID], [ASSET_GUID], EXAM_REPORT[CES EXAM.EXAM_TYPE_SR_KEY], 2 )
注意:如果FilteredRows里有多条记录,LOOKUPVALUE仍会报错,所以这种写法只适合数据唯一的场景
为什么之前的类型转换没用?
你尝试的字符串/VALUE转换没用,是因为根本问题不是列的类型不匹配,而是你把筛选表达式(布尔值)当成了匹配值,逻辑方向错了,转换类型自然解决不了本质问题。
内容的提问来源于stack exchange,提问作者Paolo Negro

