如何修复DAX代码以在Power BI中生成目标客户流失矩阵?
Power BI同期群活跃客户矩阵DAX问题解决
需求说明
需要创建矩阵展示各同期群活跃客户数量随时间的变化:
- 矩阵行:
Calendar_table[Month & Year](日历表与订阅表为一对多关系) - 矩阵列:通过
GENERATESERIES(0,11,1)生成的Months After列
尝试的DAX代码
Attempt1
Attempt1 = VAR CohortStartMonth = SELECTEDVALUE ( Subscriptions_export[Join Month] ) VAR CurrentMonth = EOMONTH ( CohortStartMonth, SELECTEDVALUE ('Months After'[Value])) RETURN CALCULATE ( COUNTROWS ( VALUES(Subscriptions_export[Customer ID])), Subscriptions_export[CreatedatAtDate EOM] = CurrentMonth)
Attempt2
Attempt2= CALCULATE( VAR minDate = MIN(Subscriptions_export[Join Month]) VAR maxDate = CALCULATE(MAX(Subscriptions_export[Exit Month]), NOT(ISBLANK(Subscriptions_export[Exit Month]))) RETURN COUNTROWS( FILTER( Subscriptions_export, Subscriptions_export[Join Month] >= minDate && Subscriptions_export[Exit Month] <= maxDate ) ) )
问题现象
- Attempt1仅在
Months After=0的列显示数据,其余列无值 - Attempt2所有
Months After列均显示与0列相同的数值
问题分析与解决方案
核心问题
- Attempt1逻辑缺陷:仅匹配
CreatedatAtDate EOM等于计算出的目标月份的记录,本质是统计当月新增客户而非活跃客户;且SELECTEDVALUE(Subscriptions_export[Join Month])无法在矩阵行上下文正确关联同期群起始月份。 - Attempt2逻辑缺陷:未结合
Months After的列上下文计算日期范围,导致所有列使用相同筛选条件,结果完全一致。
正确DAX表达式
Cohort Active Customers = VAR CohortMonth = SELECTEDVALUE(Calendar_table[Month & Year]) VAR MonthsOffset = SELECTEDVALUE('Months After'[Value]) VAR TargetMonth = EOMONTH(CohortMonth, MonthsOffset) RETURN CALCULATE( COUNTROWS(VALUES(Subscriptions_export[Customer ID])), -- 筛选属于当前同期群的客户(加入月份等于行上下文的同期群月份) Subscriptions_export[Join Month] = CohortMonth, -- 筛选目标月份仍活跃的客户:未退出 或 退出日期晚于目标月份 OR( ISBLANK(Subscriptions_export[Exit Month]), Subscriptions_export[Exit Month] > TargetMonth ), -- 清除日历表的上下文筛选,确保目标月份的判断不受行上下文限制 ALL(Calendar_table) )
代码说明
CohortMonth:获取矩阵行对应的同期群起始月份(即客户加入的月份)MonthsOffset:获取矩阵列对应的偏移月份(0-11)TargetMonth:计算同期群起始月份加上偏移后的目标月份- 双重筛选确保统计的是对应同期群中在目标月份仍活跃的客户,
ALL(Calendar_table)避免行上下文的日历月份干扰目标月份的判断
内容的提问来源于stack exchange,提问作者Eszter
相关产品推荐
相关产品推荐

