Power BI中订单审批周期分段平均计算的空值问题排查
问题梳理
需求
计算订单从Status_ID = 1140(流程起点)到Status_ID = 2400(采购终点)的平均耗时,要求:
- 拆分为OR(订单申请)、**PO(采购订单)**两个阶段分别计算
- 计算耗时需排除周末日期
现有问题
- 整体平均耗时的DAX计算结果正确
- 用矩阵按OR/PO阶段拆分展示时,各阶段平均值之和与整体平均值不匹配
- 样本测试数据无此问题,但实际业务数据出现偏差,怀疑是空值导致的样本范围不一致
原因分析
- 样本范围不一致:部分订单可能缺失OR或PO阶段的状态记录,矩阵可视化会自动过滤这些空值行,但整体计算仍包含所有订单,导致拆分后的计算样本量小于整体样本量
- 上下文过滤逻辑偏差:阶段拆分时的DAX未严格限定订单必须同时具备完整的流程节点记录,导致阶段计算的订单集合与整体计算的订单集合不重合
- 周末排除逻辑未适配阶段:阶段耗时计算时,周末排除的日期区间未精准对应阶段的起止时间,导致阶段耗时计算误差
解决方案
1. 统一计算的订单样本范围
确保OR/PO阶段的计算仅包含**同时具备完整流程节点(1140→OR终点→2400)**的订单,避免因缺失阶段记录导致样本偏差。
2. 修正阶段耗时的DAX代码
假设数据模型包含:
OrderStatus表:存储OrderID、Status_ID、Status_Date(状态变更日期)Date表:存储日期维度,包含IsWeekend(是否为周末,TRUE/FALSE)
整体平均耗时(基准代码)
整体平均耗时 = VAR 起点日期 = CALCULATE(MAX(OrderStatus[Status_Date]), OrderStatus[Status_ID] = 1140) VAR 终点日期 = CALCULATE(MAX(OrderStatus[Status_Date]), OrderStatus[Status_ID] = 2400) VAR 工作日天数 = DATEDIFF(起点日期, 终点日期, DAY) - CALCULATE( COUNT(Date[Date]), Date[Date] > 起点日期 && Date[Date] < 终点日期, Date[IsWeekend] = TRUE() ) RETURN AVERAGEX(VALUES(OrderStatus[OrderID]), 工作日天数)
OR阶段平均耗时(替换[OR阶段终点Status_ID]为实际业务中的OR阶段结束状态ID)
OR阶段平均耗时 = VAR 起点日期 = CALCULATE(MAX(OrderStatus[Status_Date]), OrderStatus[Status_ID] = 1140) VAR OR阶段终点日期 = CALCULATE(MAX(OrderStatus[Status_Date]), OrderStatus[Status_ID] = [OR阶段终点Status_ID]) -- 仅保留同时有起点和OR终点记录的订单 VAR 有效订单 = FILTER(VALUES(OrderStatus[OrderID]), NOT(ISBLANK(起点日期)) && NOT(ISBLANK(OR阶段终点日期))) VAR OR阶段工作日 = DATEDIFF(起点日期, OR阶段终点日期, DAY) - CALCULATE( COUNT(Date[Date]), Date[Date] > 起点日期 && Date[Date] < OR阶段终点日期, Date[IsWeekend] = TRUE() ) RETURN AVERAGEX(有效订单, OR阶段工作日)
PO阶段平均耗时(同样替换[OR阶段终点Status_ID]为实际值)
PO阶段平均耗时 = VAR OR阶段终点日期 = CALCULATE(MAX(OrderStatus[Status_Date]), OrderStatus[Status_ID] = [OR阶段终点Status_ID]) VAR 终点日期 = CALCULATE(MAX(OrderStatus[Status_Date]), OrderStatus[Status_ID] = 2400) -- 仅保留同时有OR终点和最终终点记录的订单 VAR 有效订单 = FILTER(VALUES(OrderStatus[OrderID]), NOT(ISBLANK(OR阶段终点日期)) && NOT(ISBLANK(终点日期))) VAR PO阶段工作日 = DATEDIFF(OR阶段终点日期, 终点日期, DAY) - CALCULATE( COUNT(Date[Date]), Date[Date] > OR阶段终点日期 && Date[Date] < 终点日期, Date[IsWeekend] = TRUE() ) RETURN AVERAGEX(有效订单, PO阶段工作日)
3. 矩阵可视化的空值过滤
在矩阵的筛选器中添加规则,排除OR/PO阶段耗时为空的订单,确保矩阵展示的订单集合与整体计算完全一致:
- 选中矩阵组件
- 在右侧「筛选器」面板中,对
OR阶段平均耗时和PO阶段平均耗时字段设置不为空的过滤条件
验证要点
调整后需确认:
- 所有阶段计算的订单数量与整体计算的订单数量完全一致
OR阶段耗时总和 + PO阶段耗时总和 = 整体耗时总和,此时各阶段平均值的加权平均(以订单数为权重)应等于整体平均值
内容的提问来源于stack exchange,提问作者Rihards Gaveiks
相关产品推荐
相关产品推荐

