如何实现遇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数据,该度量会输出:
Month ReverseRunningTotal Jun 2023 140 May 2023 270 Feb 2023 120 Jan 2023 220
内容的提问来源于stack exchange,提问作者Swati
相关产品推荐
相关产品推荐

