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

如何实现遇2+连续缺月时重置的DAX反向累计总计?

实现带连续数据缺口重置的反向累计DAX度量值

要满足你的需求,核心思路是先为每个产品的销售月份划分"活跃组"——当两个销售月份之间存在≥2个连续缺失月时,将其归为不同组;再在每个组内执行反向累计求和。以下是分步实现的DAX代码:

1. 辅助度量:获取上一个有销售的月份

用于计算当前销售月份与上一个有销售月份的间隔:

Last Sales Month = 
VAR CurrentMonth = MAX('Date'[MonthEndDate]) -- 替换为Date表中代表每月末的日期列(如EOMONTH('Date'[Date],0))
VAR CurrentProduct = MAX('Sales'[Product])
RETURN
CALCULATE(
    MAX('Date'[MonthEndDate]),
    FILTER(
        ALLSELECTED('Sales'),
        'Sales'[Product] = CurrentProduct
            && 'Date'[MonthEndDate] < CurrentMonth
    )
)

2. 辅助度量:计算与上一个销售月的间隔月数

判断是否存在≥2个连续缺失月:

Months Since Last Sale = 
VAR CurrentMonth = MAX('Date'[MonthEndDate])
VAR LastMonth = [Last Sales Month]
RETURN
IF(
    NOT ISBLANK(LastMonth),
    DATEDIFF(LastMonth, CurrentMonth, MONTH),
    0 -- 第一个销售月份无前置销售月,间隔记为0
)

3. 辅助度量:标记活跃组ID

当间隔≥2时,开启新的活跃组:

Active Group ID = 
VAR CurrentProduct = MAX('Sales'[Product])
VAR CurrentMonth = MAX('Date'[MonthEndDate])
-- 获取当前产品所有有销售的月份及间隔值
VAR SalesMonths = 
    CALCULATETABLE(
        ADDCOLUMNS(
            VALUES('Date'[MonthEndDate]),
            "@MonthsSinceLast", [Months Since Last Sale]
        ),
        ALLSELECTED('Sales'),
        'Sales'[Product] = CurrentProduct,
        NOT ISBLANK(SUM('Sales'[SalesAmount])) -- 仅保留有销售记录的月份(排除销售额为0的行)
    )
-- 为每个月份分配组ID:间隔≥2时组ID+1
VAR GroupedMonths = 
    ADDCOLUMNS(
        SalesMonths,
        "@GroupID",
        SUMX(
            FILTER(SalesMonths, 'Date'[MonthEndDate] <= EARLIER('Date'[MonthEndDate])),
            IF([@MonthsSinceLast] >= 2, 1, 0)
        )
    )
RETURN
MAXX(
    FILTER(GroupedMonths, 'Date'[MonthEndDate] = CurrentMonth),
    [@GroupID]
)

4. 最终度量:反向累计总计

在同一活跃组内,从当前月份向前(含当前)求和:

Reverse Running Total = 
VAR CurrentProduct = MAX('Sales'[Product])
VAR CurrentGroup = [Active Group ID]
VAR CurrentMonth = MAX('Date'[MonthEndDate])
-- 获取当前产品当前组内的所有销售月份
VAR GroupSalesMonths = 
    CALCULATETABLE(
        VALUES('Date'[MonthEndDate]),
        ALLSELECTED('Sales'),
        'Sales'[Product] = CurrentProduct,
        [Active Group ID] = CurrentGroup,
        NOT ISBLANK(SUM('Sales'[SalesAmount]))
    )
RETURN
CALCULATE(
    SUM('Sales'[SalesAmount]),
    FILTER(
        GroupSalesMonths,
        'Date'[MonthEndDate] >= CurrentMonth
    )
)

关键说明

  • Date表要求:需包含连续的月份数据,且有明确的月份标识列(如MonthEndDate或YearMonth数值列,若用数值列需调整间隔计算逻辑)。
  • 适配切片器:所有度量使用ALLSELECTED,年份、区域等切片器会自动过滤上下文,不影响分组与累计逻辑。
  • 忽略销售额为0:通过NOT ISBLANK(SUM('Sales'[SalesAmount]))仅保留有销售行的月份,自动排除销售额为0的记录。
  • 示例验证:针对你提供的产品A数据,该度量会输出:
    MonthReverseRunningTotal
    Jun 2023140
    May 2023270
    Feb 2023120
    Jan 2023220

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:08:18