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

DAX中日期切片器选上年时YTD度量失效问题及修复需求

DAX度量问题:不受上年日期切片器影响的当年YTD总额

测试数据

测试数据

日期表DAX代码

Dates = CALENDAR(date(2022,1,1),TODAY())

表间关系

表关系

需求

创建一个度量,即使日期切片器起始时间为上年,仍能显示当年的YTD总额。

现有代码

YTD = 
VAR minim = CALCULATE( MIN( Dates[Date]), ALLSELECTED(Dates[Date]))
var startyear = DATE(YEAR(TODAY()),1,1)
return if( minim >= startyear , 
calculate(sum(test[Totals] ), FILTER(Dates, Dates[Date] >= startyear))  ,  
 calculate(sum(test[Totals] ), FILTER(Dates, Dates[Date] >= startyear)) )

测试场景

  • 场景1正常:日期切片器从2022年开始,度量显示正确的当年YTD结果。
    场景1
  • 场景2失效:显示结果为40,正确结果应为130。
    场景2
  • 场景3失效:即使年份为当年,度量仍无法正常工作。
    场景3

问题分析

你当前的代码核心问题有两个:

  1. IF语句的两个分支逻辑完全一致,等于没做判断,根本无法区分切片器起始时间是否在上年的情况;
  2. 直接用FILTER(Dates, ...)时,没有清除日期切片器的筛选上下文,导致当切片器包含上年日期时,计算范围被限制在切片器选中的日期内,无法取出当年完整的YTD数据。

正确DAX代码

当年YTD总额 = 
VAR 当前年份 = YEAR(TODAY())
VAR 当年起始 = DATE(当前年份, 1, 1)
VAR 当年截止 = TODAY()
RETURN
CALCULATE(
    SUM(test[Totals]),
    ALL(Dates),  // 清除日期表上的所有切片器筛选
    Dates[Date] >= 当年起始,
    Dates[Date] <= 当年截止
)

代码说明

  • ALL(Dates):彻底移除日期表的切片器筛选,确保能访问到当年所有日期的数据,不受切片器选择的上年日期影响;
  • 明确限定日期范围在当年1月1日至今日,精准计算当年YTD总额;
  • 如果需要保留其他维度的筛选(比如产品类别、区域等),可以把ALL(Dates)替换为ALLSELECTED(Dates[Date]),这样只会清除日期切片器的筛选,保留其他筛选条件。

可选优化(支持动态年份)

如果需要实现“切片器选哪年就显示哪年YTD”的功能,可用以下代码:

动态年份YTD总额 = 
VAR 选中年份 = SELECTEDVALUE(Dates[Year], YEAR(TODAY()))
VAR 年份起始 = DATE(选中年份, 1, 1)
VAR 年份截止 = IF(选中年份 = YEAR(TODAY()), TODAY(), DATE(选中年份, 12, 31))
RETURN
CALCULATE(
    SUM(test[Totals]),
    ALLSELECTED(Dates[Date]),
    Dates[Date] >= 年份起始,
    Dates[Date] <= 年份截止
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:33:33