如何在DAX中计算每年纯新增客户数量(排除流失复购客户)
嘿,我来帮你解决这个DAX计算的难题——要统计每年真正的首次新增客户,排除那些流失后又复购的老客户,对吧?这确实不能直接拿两年的客户数相减,那样会把复购的误算成新增。下面是具体的解决思路和代码,保证精准满足你的需求:
核心解决思路
本质逻辑很简单:每个客户只在他首次产生交易的年份被统计为新增客户,后续无论是否复购都不再计入任何年份的新增。所以我们需要先定位每个客户的首次交易年份,再按年份统计对应首次年份的客户数量。
方法一:先建计算列,再做度量值(直观易理解)
这种方式适合新手快速上手,逻辑清晰:
1. 添加「首次购买年份」计算列
在你的销售数据表(比如命名为销售表)里新建一个计算列:
首次购买年份 = CALCULATE( MIN('销售表'[订单年份]), ALLEXCEPT('销售表', '销售表'[客户ID]) )
ALLEXCEPT('销售表', '销售表'[客户ID]):保留当前行的客户ID筛选规则,清除其他所有筛选,这样就能聚焦到该客户的所有订单记录。MIN('销售表'[订单年份]):提取该客户所有订单里最早的年份,也就是他的首次购买年份。
2. 创建「纯新增客户数量」度量值
接着创建度量值来按年份统计符合条件的客户:
纯新增客户数量 = CALCULATE( DISTINCTCOUNT('销售表'[客户ID]), FILTER( ALL('销售表'), '销售表'[首次购买年份] = SELECTEDVALUE('日期表'[年份]) ) )
SELECTEDVALUE('日期表'[年份]):获取当前图表或筛选器选中的目标年份。- 筛选出所有首次购买年份等于当前选中年份的客户,再用
DISTINCTCOUNT统计去重后的客户数量。
方法二:单度量值直接计算(无需额外计算列)
如果不想增加数据表的计算列,也可以用一个度量值直接完成计算:
纯新增客户数量 = VAR 当前选中年份 = SELECTEDVALUE('日期表'[年份]) RETURN CALCULATE( DISTINCTCOUNT('销售表'[客户ID]), FILTER( VALUES('销售表'[客户ID]), -- 计算当前客户的首次购买年份 CALCULATE(MIN('销售表'[订单年份])) = 当前选中年份 ) )
- 用
VAR定义当前选中年份,让代码结构更清晰易读。 VALUES('销售表'[客户ID]):获取所有不重复的客户ID列表。- 对每个客户单独计算他的首次购买年份,判断是否等于当前选中年份,只有符合条件的客户才会被统计。
逻辑验证示例
举个实际场景例子:
- 客户A在2020年首次购买,2021年无交易(流失),2022年再次复购。
- 用我们的方法,2020年的新增客户会包含A,2021和2022年都不会统计他,完全符合“纯首次新增”的要求。
- 如果用两年客户数差值(比如2022年客户数 - 2021年客户数),会错误地把A算成2022年的新增客户,这正是我们要避免的问题。
内容的提问来源于stack exchange,提问作者Mathieu Ricour
相关产品推荐
相关产品推荐

