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

如何构建DAX实现跨年度累计数据查询及同期同比对比?

嘿,这两个DAX需求在时间智能分析里太常见了,我来一步步帮你解决:

1. 查看各年份截至当前月份的所有数据

你提到用YTD()函数会计算全年12个月,这应该是因为YTD()默认是基于当前日期的本年累计,但如果你的需求是“截至当前月份”(比如现在是4月,要展示各年份1-4月的全部数据),那得换个思路——提取当前的月份维度,然后筛选每个年份中对应月份范围的数据。

假设你的日期表叫Date,事实表(比如销售表)叫Sales,可以用这个自定义度量值:

截至当前月份累计 = 
VAR CurrentMonth = MONTH(MAX('Date'[Date]))  -- 获取当前上下文的月份(比如切片器选了2018年4月,就返回4)
RETURN
CALCULATE(
    SUM(Sales[Amount]),  -- 替换成你需要聚合的指标,比如销售额、订单量
    FILTER(
        ALL('Date'),
        MONTH('Date'[Date]) <= CurrentMonth &&
        YEAR('Date'[Date]) = YEAR(MAX('Date'[Date]))  -- 锁定当前年份
    )
)

如果想要跨年份对比各年截至当前报表打开月份的数据(比如现在是4月,直接看2021、2022、2023年的1-4月数据),可以改成:

各年截至当前报表月份累计 = 
VAR ReportMonth = MONTH(TODAY())  -- 取系统当前时间的月份
RETURN
CALCULATE(
    SUM(Sales[Amount]),
    FILTER(
        ALL('Date'),
        MONTH('Date'[Date]) <= ReportMonth
    )
)

这个版本会忽略切片器的月份筛选,只保留每个年份中月份不超过当前报表打开月份的数据,完美实现跨年度同期对比。

2. 截至指定日期的数据与上年同期对比

这个需求的核心是动态匹配上年的同期日期范围,还要兼容切片器的年份选择。比如你举的例子:当前日期是2018年4月5日,切片器选2017年时,要同时展示2018年1-4月5日和2017年1-4月5日的数据。

我给你写两个配套的度量值,分别计算本年截至指定日期的累计,和上年同期的累计:

本年截至指定日期累计

本年截至今日累计 = 
VAR TodayDate = TODAY()  -- 取当前系统日期作为指定日期,也可以换成切片器选择的日期
RETURN
CALCULATE(
    SUM(Sales[Amount]),
    FILTER(
        ALL('Date'),
        'Date'[Date] <= TodayDate &&
        YEAR('Date'[Date]) = YEAR(TodayDate)
    )
)

上年同期截至指定日期累计

上年同期截至今日累计 = 
VAR TodayDate = TODAY()
VAR LastYearSameDate = DATE(YEAR(TodayDate)-1, MONTH(TodayDate), DAY(TodayDate))  -- 计算上年同期的日期
VAR SelectedYear = SELECTEDVALUE('Date'[Year])  -- 获取切片器选中的年份
RETURN
CALCULATE(
    SUM(Sales[Amount]),
    FILTER(
        ALL('Date'),
        'Date'[Date] <= LastYearSameDate &&
        YEAR('Date'[Date]) = SelectedYear
    )
)

这样设置后,当你在切片器里选中2017年,就能同时看到2018年(本年)截至4月5日的累计数据,和2017年截至4月5日的累计数据,完全符合你的需求。

如果你想用DAX自带的时间智能函数简化,也可以用SAMEPERIODLASTYEAR(),但自定义筛选的方式更直观,方便后续调试:

上年同期累计(简化版) = 
VAR SelectedDate = MAX('Date'[Date])
RETURN
CALCULATE(
    SUM(Sales[Amount]),
    SAMEPERIODLASTYEAR('Date'[Date]),
    'Date'[Date] <= DATE(YEAR(SelectedDate)-1, MONTH(SelectedDate), DAY(SelectedDate))
)

需要注意的是,不管用哪种方式,都要确保你的日期表是完整且无重复的,并且和事实表建立了正确的关系,这是DAX时间智能函数正常工作的前提哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:07:22