PowerBI DAX 计算EX02与VA02值存在差异的文档ID非重复计数
DAX实现:统计存在自动提取值与人工校验值差异的文档非重复计数
前置准备
DAX无法直接识别数据源的原始行排列顺序,你需要先在Power Query编辑器中完成以下字段加工,确保两类记录可按顺序匹配:
- 按
DOCID分组,筛选CALL_POINT = "EX02"的记录,按原始排列顺序生成从1开始的连续组内序号,命名为Ex_Seq - 同理按
DOCID分组,筛选CALL_POINT = "VA02"的记录,按原始排列顺序生成从1开始的连续组内序号,命名为Va_Seq
加工完成后,同一DOCID下Ex_Seq = n的自动提取记录,将与Va_Seq = n的人工校验记录一一对应。
度量值代码
将代码中的表名、字段名替换为你模型中的实际名称即可使用:
差异文档计数 = COUNTROWS ( FILTER ( -- 遍历所有非重复DOCID VALUES ( '业务数据表'[DOCID] ), VAR CurrDoc = '业务数据表'[DOCID] -- 提取当前文档下所有自动提取环节的序号和取值 VAR ExSet = SELECTCOLUMNS ( FILTER ( ALL('业务数据表'), '业务数据表'[DOCID] = CurrDoc && '业务数据表'[CALL_POINT] = "EX02" ), "Seq", [Ex_Seq], "ExVal", [取值字段] ) -- 提取当前文档下所有人工校验环节的序号和取值 VAR VaSet = SELECTCOLUMNS ( FILTER ( ALL('业务数据表'), '业务数据表'[DOCID] = CurrDoc && '业务数据表'[CALL_POINT] = "VA02" ), "Seq", [Va_Seq], "VaVal", [取值字段] ) -- 按序号关联后检查是否存在值不匹配的记录对 VAR MismatchRows = FILTER ( NATURALINNERJOIN(ExSet, VaSet), -- 用差值判断规避浮点数精度误差,可根据业务精度要求调整阈值 ABS([ExVal] - [VaVal]) > 0.001 ) RETURN -- 存在不匹配记录则当前DOCID计入统计 NOT ISEMPTY(MismatchRows) ) )
场景验证
- 单文档场景:DOCID 654474存在第2行EX02取值44.57、对应VA02取值0.00的差异,度量值返回结果为
1,符合预期 - 多文档场景:DOCID 654476(10.00 vs 15.00)、DOCID 654477(95.73 vs 95.00)均存在取值差异,度量值返回结果为
2,符合预期
优化提示
如果你在Power Query阶段已经将同DOCID同序号的EX02、VA02取值合并到同一行,可以使用更简洁的度量值:
差异文档计数_简化版 = COUNTROWS ( FILTER ( VALUES('业务数据表'[DOCID]), CALCULATE( COUNTROWS('业务数据表'), ABS('业务数据表'[EX02取值] - '业务数据表'[VA02取值]) > 0.001 ) > 0 ) )
内容的提问来源于stack exchange,提问作者Matas
相关产品推荐
相关产品推荐

