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

Power BI累计损失计算问题求助(需调试DAX度量值)

解决Power BI中按Category和TP维度计算累计损失的DAX问题

数据与需求

现有「月度损失表(Month Loss Table)」,包含核心字段:

  • TP:时间周期(实际范围-6至24,对应202211-202410)
  • Category:类别维度(取值R/NR)
  • LossAmount:损失金额(范围-20000至20000000,含0)
  • NumberOfAccounts:账户数量(正整数)

样本数据(TP 0-5)

CategoryTP=0TP=1TP=2TP=3TP=4TP=5
R1914191825
NR099112123

累计计算逻辑

  • TP=0时,累计值与当月损失值一致
  • TP>0时,累计值 = 上一TP的累计值 + 当前TP的月度损失值

预期输出

CategoryTP=0TP=1TP=2TP=3TP=4TP=5
R11024436287
NR0918295074

当前实现与问题

已实现两个可正常运行的基础度量值:

Loss per Acct = DIVIDE(SUM(LossAmount), SUM(NumberOfAccounts), 0)
TotalLossPerAcct = 
VAR R_Total = CALCULATE([Loss per Acct], Sheet1[Category] = "R")
VAR NR_Total = CALCULATE([Loss per Acct], Sheet1[Category] = "NR") / 0.5
RETURN
SWITCH(SELECTEDVALUE(Sheet1[Tag]),
    "R", R_Total,
    "NR", NR_Total
)

尝试编写的累计度量值无法得到正确结果,数值偏差大:

Cumulative_Loss =
VAR CurrentTP = SELECTEDVALUE(MyTable[TP])
VAR CurrentCAT = SELECTEDVALUE(MyTable[Category])
RETURN
    SUMX(
        FILTER(
            ALL(MyTable),
            MyTable[TP] <= CurrentTP && MyTable[Category] = CurrentCAT
        ),
        [TotalLossPerAcct]
    )

核心问题

  • 上下文过滤错误:ALL(MyTable)清除了所有外部筛选上下文,可能混入无关维度数据
  • 维度冲突:TotalLossPerAcct依赖Sheet1[Tag],与累计度量值依赖的Category维度存在上下文冲突

修正后的DAX解决方案

方案1:基于现有度量值重构累计逻辑

先调整TotalLossPerAcct,使其直接依赖Category维度,避免与Tag的上下文冲突:

TotalLossPerAcct = 
VAR CurrentCategory = SELECTEDVALUE(Sheet1[Category])
VAR BaseLoss = [Loss per Acct]
RETURN
    SWITCH(CurrentCategory,
        "R", BaseLoss,
        "NR", BaseLoss / 0.5,
        0
    )

然后编写累计度量值,精准控制上下文:

Cumulative_Loss = 
VAR CurrentTP = SELECTEDVALUE(Sheet1[TP])
VAR CurrentCategory = SELECTEDVALUE(Sheet1[Category])
RETURN
    SUMX(
        // 仅保留当前Category下TP≤当前值的行,同时保留外部筛选上下文
        FILTER(
            ALLSELECTED(Sheet1[TP], Sheet1[Category]),
            Sheet1[Category] = CurrentCategory && Sheet1[TP] <= CurrentTP
        ),
        [TotalLossPerAcct]
    )

方案2:直接计算累计(性能更优)

如果无需保留TotalLossPerAcct的中间转换,可直接计算累计,减少上下文切换开销:

Cumulative_Loss_Direct = 
VAR CurrentTP = SELECTEDVALUE(Sheet1[TP])
VAR CurrentCategory = SELECTEDVALUE(Sheet1[Category])
VAR FilteredData = 
    FILTER(
        ALLSELECTED(Sheet1),
        Sheet1[Category] = CurrentCategory && Sheet1[TP] <= CurrentTP
    )
VAR BaseCumulative = DIVIDE(
    SUMX(FilteredData, Sheet1[LossAmount]),
    SUMX(FilteredData, Sheet1[NumberOfAccounts]),
    0
)
RETURN
    SWITCH(CurrentCategory,
        "NR", BaseCumulative / 0.5,
        BaseCumulative
    )

关键说明

  • 上下文控制:使用ALLSELECTED(Sheet1[TP], Sheet1[Category])替代ALL(MyTable),保留页面级等外部筛选,仅清除TP和Category的内部筛选,确保累计范围正确
  • 维度一致性:确保所有度量值的维度依赖统一,避免Tag与Category的上下文冲突
  • 性能优化:直接计算累计的方案(方案2)在大数据量场景下性能更优,减少嵌套度量值的上下文切换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:45:10