如何使用DAX计算订阅服务的月度经常性收入(MRR)
如何使用DAX计算订阅服务的月度经常性收入(MRR)
嘿,我完全懂你的困扰——之前用的CALCULATE(SUM(CRMTable[Revenue]), CRMTable[Contract] <> "0")只是把所有符合条件的收入一次性加总,根本没考虑合同的生效周期,自然没法得到分月的MRR。别着急,我们针对你给出的示例场景,写一个精准的DAX度量值就能解决问题。
首先先明确你的业务逻辑:每笔标记为X(Contract≠"0")的合同,会从ContractDate所在月份开始,到ContractEnd所在月份的前一个月结束,每个月贡献等额的Revenue(也就是你的示例里每个合同每月带来1000元)。我们需要把每个合同的贡献分摊到它生效的每个月份,再汇总出当月的总MRR。
假设你已经有了关联好的日历表(命名为Calendar),里面包含Date(日期字段,用来关联CRM表的日期)和YearMonth(格式如"01/2023",用来展示月份),那可以用下面的DAX度量值:
MRR = SUMX( // 先过滤出所有符合条件的合同(Contract不等于"0") FILTER(CRMTable, CRMTable[Contract] <> "0"), // 定义合同的生效起始月份(取ContractDate所在月的第一天) VAR ContractStartMonth = EOMONTH(CRMTable[ContractDate], -1) + 1 // 定义合同的生效结束月份(取ContractEnd所在月的前一个月最后一天,因为ContractEnd是当月第一天,意味着上个月是最后生效月) VAR ContractEndMonth = EOMONTH(CRMTable[ContractEnd], -1) // 定义当前日历月的第一天 VAR CurrentMonthStart = EOMONTH(MAX(Calendar[Date]), -1) + 1 RETURN // 判断当前月是否在合同的生效周期内,是则计入该合同的Revenue,否则计0 IF( CurrentMonthStart >= ContractStartMonth && CurrentMonthStart <= ContractEndMonth, CRMTable[Revenue], 0 ) )
公式逻辑解释:
- SUMX遍历合同:
SUMX会逐个处理每笔符合条件的合同,计算它在当前月的贡献后再汇总。 - 确定合同生效周期:
ContractStartMonth:把合同开始日期转换为当月第一天,比如01/01/2023就变成01/01/2023。ContractEndMonth:把合同结束日期转换为前一个月的最后一天,比如01/06/2023就变成31/05/2023,这样就能准确判断合同的最后生效月是5月。
- 判断当前月是否生效:对比当前日历月的第一天是否在合同的生效起止范围内,是的话就把该合同的
Revenue计入当月MRR,否则不计。
把这个度量值和你的日历表YearMonth字段搭配使用,就能得到你想要的月度MRR结果,直接用来做折线图就可以啦。
备注:内容来源于stack exchange,提问作者rodrigo nilo
相关产品推荐
相关产品推荐

