Power BI中在DIM Contract表新增列同步FCT General Ledger的EC_Value值
需求说明
需在DIM Contract表中新增EC Included列,规则为:当FCT General Ledger表中存在与当前Contract_PK匹配的contract_fk,且对应EC_Value为1时,该列返回1;否则返回0。尝试的三个DAX公式均未达预期,具体问题及分析如下:
原公式问题分析
公式1:SUM逻辑导致误判
EC Included = VAR curValue = SELECTEDVALUE('DIM Contract'[Contract_PK]) VAR ecValue = CALCULATE( SUM('FCT General Ledger'[EC_Value]), FILTER('FCT General Ledger', 'FCT General Ledger'[contract_fk] = curValue ) ) RETURN IF( ecValue = 1, 1, 0 )
问题:若同一contract_fk对应多条EC_Value=1的记录,SUM结果会大于1,IF判断不成立返回0;无匹配记录时ecValue为空白,同样返回0,最终导致全0结果。
公式2:LOOKUPVALUE多值冲突
EC Included = LOOKUPVALUE('FCT General Ledger'[EC_Value], 'FCT General Ledger'[contract_fk], 'DIM Contract'[Contract_pk])
问题:LOOKUPVALUE要求匹配结果必须唯一,若FCT General Ledger中同一contract_fk对应多条记录,会触发“提供了多值表,但需要单个值”的错误。
公式3:SELECTEDVALUE使用场景错误
EC Included = VAR curValue = SELECTEDVALUE('DIM Contract'[Contract_PK]) RETURN Calculate(MAX('FCT General Ledger'[EC_Value]),'FCT General Ledger'[contract_fk]= curValue)
问题:SELECTEDVALUE适用于报表筛选上下文场景,在计算表列时无法遍历每行的Contract_PK,无筛选时会返回默认值0,导致仅Contract_PK=0的行有结果,其余为空白。
正确DAX公式
方案1:基于记录存在性判断
EC Included = VAR curPK = 'DIM Contract'[Contract_PK] VAR hasValidEC = COUNTROWS( FILTER( 'FCT General Ledger', 'FCT General Ledger'[contract_fk] = curPK && 'FCT General Ledger'[EC_Value] = 1 ) ) > 0 RETURN IF(hasValidEC, 1, 0)
逻辑:直接统计匹配当前Contract_PK且EC_Value=1的记录数,只要存在至少一条就返回1,否则返回0。
方案2:利用MAX与CALCULATE上下文转换
EC Included = VAR curPK = 'DIM Contract'[Contract_PK] VAR maxEC = CALCULATE( MAX('FCT General Ledger'[EC_Value]), 'FCT General Ledger'[contract_fk] = curPK ) RETURN IF(maxEC = 1, 1, 0)
逻辑:通过CALCULATE自动转换行上下文,获取当前Contract_PK对应的最大EC_Value,若最大值为1则返回1,否则返回0(包含无匹配记录的情况)。
方案3:基于表关系简化(需提前建立关系)
若DIM Contract[Contract_PK]与FCT General Ledger[contract_fk]已建立一对多关系,可使用:
EC Included = VAR relatedECRecords = RELATEDTABLE('FCT General Ledger') RETURN IF(MAXX(relatedECRecords, [EC_Value]) = 1, 1, 0)
逻辑:利用已建立的关系直接获取当前合同对应的所有总账记录,取其中最大的EC_Value进行判断。
内容的提问来源于stack exchange,提问作者EvitaSchaap

