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

Power BI中按月度取最新值计算YTD累计求和的技术问题

问题:计算YTD月度累计求和(仅取每月最后一条有效观测值)

现有每日事实表,需创建DAX度量值计算YTD(年初至今)月度累计求和,但仅对每个月的最后一条有效观测值求和。使用Date日期表选择特定月份,Date Copy表展示所选月份之前的当年所有月份,Pred度量值用于提取每个月来自Prediction表的最新预测值。之前编写的Bad度量值返回结果不符合预期,寻求正确实现方案。


复现环境代码

Date日期表

Date = 
ADDCOLUMNS (
    CALENDAR ( DATE ( 2023, 1, 1 ), DATE ( 2024, 12, 31 ) ),
    "Day", DAY ( [Date] ),
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month", FORMAT ( [Date], "mmm" ),
    "Month Year", FORMAT ( [Date], "mmm yyyy" ),
    "EOM", EOMONTH ( [Date], 0 )
)

Date Copy表

Date Copy = 
SELECTCOLUMNS (
'Date',
"Date", 'Date'[Date],
"Year", 'Date'[Year],
"Month", 'Date'[Month],
"Month Number", 'Date'[Month Number]
)

Prediction事实表

Prediction = 
ADDCOLUMNS (
    CALENDAR ( DATE ( 2023, 1, 1 ), DATE ( 2024, 3, 28 ) ),
    "Prediction",
        (
            1000 * DAY ( EOMONTH ( [Date], 0 ) ) - 10
        )
)

现有错误度量值(Bad)

Bad = 
VAR LatestMonth =
    SELECTEDVALUE ( 'Date'[Month Number] )
VAR Tbl =
    SUMMARIZE (
        ALLSELECTED ( 'Date Copy' ),
        'Date Copy'[Month Number],
        'Date Copy'[Year],
        "Bad", [Pred]
    )
RETURN
    SUMX ( FILTER ( Tbl, [Month Number] <= LatestMonth ), [Pred] )

问题分析与正确实现

错误原因

原Bad度量值的核心问题在于:SUMX迭代时直接引用[Pred]会重新计算该度量值,而非使用SUMMARIZE中已生成的"Bad"列结果;同时未明确锁定当前选中年份,可能导致跨年度求和错误。

正确度量值实现

1. 优化后的YTD累计度量值

YTD_Latest_Monthly_Pred = 
VAR SelectedYear = SELECTEDVALUE('Date'[Year])
VAR LatestMonth = SELECTEDVALUE('Date'[Month Number])
-- 按年、月分组,计算每个月的最新预测值
VAR MonthlyLatestPred = 
    SUMMARIZE(
        FILTER(ALLSELECTED('Date Copy'), 
            'Date Copy'[Year] = SelectedYear && 'Date Copy'[Month Number] <= LatestMonth
        ),
        'Date Copy'[Year],
        'Date Copy'[Month Number],
        "Monthly_Latest_Pred", [Pred]
    )
RETURN
    SUMX(MonthlyLatestPred, [Monthly_Latest_Pred])

2. 优化Pred度量值(确保单月最新值准确)

如果原Pred度量值存在上下文计算偏差,可替换为以下实现:

Pred = 
VAR CurrentYear = SELECTEDVALUE('Date Copy'[Year])
VAR CurrentMonth = SELECTEDVALUE('Date Copy'[Month Number])
-- 获取当前月最后一条有预测值的日期
VAR LastValidDate = 
    CALCULATE(
        MAX('Prediction'[Date]),
        FILTER('Prediction', 
            YEAR('Prediction'[Date]) = CurrentYear && MONTH('Prediction'[Date]) = CurrentMonth
        )
    )
RETURN
    CALCULATE(
        SUM('Prediction'[Prediction]),
        'Prediction'[Date] = LastValidDate,
        USERELATIONSHIP('Prediction'[Date], 'Date Copy'[Date])
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:53:18