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

Power BI矩阵度量值总计计算异常,HASONEFILTER调试失败求助

解决Power BI度量值总计不正确的问题

看起来你遇到的核心问题是度量值在总计行时没有按各分组的结果正确求和/计算,根源在于原度量值使用FIRSTDATE(Table1[due_date])获取到期月份,在总计上下文里这个值会取整个表的最早到期月,而非按每个月计算后汇总。另外原Done on time的筛选逻辑和你定义的“到期当月完成工单”不符(你写了包含前后一个月的完成记录),这也会导致计算偏差。

我来帮你重新梳理并修正这些度量值:

第一步:先确认基础度量值[Due]

首先确保[Due]是正确计算当月到期工单总数的度量值(假设你用工单ID作为唯一标识):

Due = CALCULATE(COUNT(Table1[工单ID]), NOT(ISBLANK(Table1[due_date])))

第二步:修正「Done on time」(到期当月完成工单)

用SUMX迭代每个到期年月的分组,确保每个月的按时完成数单独计算后,总计行自动求和:

Done on time = 
SUMX(
    // 按到期年+月分组,避免跨年月份混淆
    SUMMARIZE(Table1, Table1[due_date].[Year], Table1[due_date].[Month]),
    VAR CurrentDueYear = [Year]
    VAR CurrentDueMonth = [Month]
    RETURN
    CALCULATE(
        COUNT(Table1[工单ID]),
        // 筛选:完成日期在到期当月,且完成日期不晚于到期日期(符合"按时"定义)
        YEAR(Table1[completed]) = CurrentDueYear,
        MONTH(Table1[completed]) = CurrentDueMonth,
        Table1[completed] <= Table1[due_date],
        NOT(ISBLANK(Table1[completed]))
    )
)

如果你的“按时”仅指完成月份和到期月份一致(不管具体日期是否逾期),可以去掉Table1[completed] <= Table1[due_date]这一行。

第三步:修正「Outside time」(逾期完成工单)

逾期完成的工单可以定义为:到期工单中,完成日期晚于到期日期且已完成的记录。同样用迭代逻辑确保总计正确:

Outside time = 
SUMX(
    SUMMARIZE(Table1, Table1[due_date].[Year], Table1[due_date].[Month]),
    VAR CurrentDueYear = [Year]
    VAR CurrentDueMonth = [Month]
    RETURN
    CALCULATE(
        COUNT(Table1[工单ID]),
        Table1[completed] > Table1[due_date],
        NOT(ISBLANK(Table1[completed])),
        YEAR(Table1[due_date]) = CurrentDueYear,
        MONTH(Table1[due_date]) = CurrentDueMonth
    )
)

或者更简单的方式:Outside time = [Due] - [Done on time] - [Incomplete],前提是[Incomplete]正确。

第四步:「Incomplete」(未完成工单)

Incomplete = 
CALCULATE(
    COUNT(Table1[工单ID]),
    ISBLANK(Table1[completed]),
    NOT(ISBLANK(Table1[due_date]))
)

第五步:修正「% Perf」(按时完成百分比)

百分比的总计不能直接取各月百分比的平均,而应该用总按时完成数 ÷ 总到期工单数。用ISINSCOPE判断当前上下文是月度还是总计:

% Perf = 
VAR TotalMonthlyDone = [Done on time]
VAR TotalMonthlyDue = [Due]
VAR TotalOverallDone = SUMX(SUMMARIZE(Table1, Table1[due_date].[Year], Table1[due_date].[Month]), [Done on time])
VAR TotalOverallDue = SUMX(SUMMARIZE(Table1, Table1[due_date].[Year], Table1[due_date].[Month]), [Due])
RETURN
IF(
    // 如果是月度上下文,计算当月百分比
    ISINSCOPE(Table1[due_date].[Month]),
    DIVIDE(TotalMonthlyDone, TotalMonthlyDue, BLANK()) * 100,
    // 如果是总计行,计算整体百分比
    DIVIDE(TotalOverallDone, TotalOverallDue, BLANK()) * 100
)

为什么原度量值失效?

  1. FIRSTDATE(Table1[due_date])在总计行时,会返回整个表中最早的到期日期的月份,而非按每个月计算后汇总,导致逻辑错误。
  2. 原Done on time的筛选包含了完成月为到期月±1的记录,和你定义的“到期当月完成”不符,这会导致按时完成数被错误放大。

替换这些度量值后,你的报表应该能正确显示各月数据和总计行的结果了。

内容的提问来源于stack exchange,提问作者Garry McKay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:57:54