You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI中订单审批周期分段平均计算的空值问题排查

问题梳理

需求

计算订单从Status_ID = 1140(流程起点)到Status_ID = 2400(采购终点)的平均耗时,要求:

  • 拆分为OR(订单申请)、**PO(采购订单)**两个阶段分别计算
  • 计算耗时需排除周末日期

现有问题

  • 整体平均耗时的DAX计算结果正确
  • 用矩阵按OR/PO阶段拆分展示时,各阶段平均值之和与整体平均值不匹配
  • 样本测试数据无此问题,但实际业务数据出现偏差,怀疑是空值导致的样本范围不一致

原因分析
  1. 样本范围不一致:部分订单可能缺失OR或PO阶段的状态记录,矩阵可视化会自动过滤这些空值行,但整体计算仍包含所有订单,导致拆分后的计算样本量小于整体样本量
  2. 上下文过滤逻辑偏差:阶段拆分时的DAX未严格限定订单必须同时具备完整的流程节点记录,导致阶段计算的订单集合与整体计算的订单集合不重合
  3. 周末排除逻辑未适配阶段:阶段耗时计算时,周末排除的日期区间未精准对应阶段的起止时间,导致阶段耗时计算误差

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:47:47