PowerBI DAX 计算客户的平均交易年龄

本文来研究客户的交易年龄。与自然年龄不同,交易年龄指的是客户在发生交易时的年龄,这在多年分析中的差异就会非常显著。

问题背景

在生意中,往往需要计算交易客户的平均年龄,但随着时间的推移,客户每年的年龄都在长大,因此,在计算中使用用户在交易时的年龄更加贴切,而不是客户的静态年龄。

静态平均年龄计算

如果客户的年龄已经由最新的年龄所标记了,这个年龄由 TODAYBIRTHDAYYEAR 共同决定。那么,其平均年龄的计算可以是:

代码语言:javascript
复制
Customer.AverageAge.Dim = 
CALCULATE(
    AVERAGEX( 
        SUMMARIZE( Customer , Customer[Age] ) , [Age]
    )
    ,
    TREATAS( VALUES( 'Order'[CustomerID] ) , Customer[CustomerID] )
)

该算法从客户表中获取已经计算得到的年龄。

动态平均年龄计算

如果考虑多年数据,那么在购买的时候用最新的用户年龄就不够合理,就需要考虑动态年龄,使用订单数据计算如下:

代码语言:javascript
复制
Customer.AverageAge.Fact = 
CALCULATE(
    AVERAGEX( 
        SUMMARIZE( Customer , Customer[BirthYear] ) , YEAR( MAX( 'Calendar'[Date] ) ) - [BirthYear]
    )
    ,
    TREATAS( VALUES( 'Order'[CustomerID] ) , Customer[CustomerID] )
)

这里通过交易时的客户找回客户表,但用交易所在的日期年份来计算年龄后再做平均,这样就更加合理。

技巧:钩子

这里使用了一个通用的 DAX 技巧:钩子。

我们称 TREATAS( VALUES( 'Order'[CustomerID] ) , Customer[CustomerID] ) 是一个钩子,它将不相关的两列挂载起来,进而可以实现计算。

效果

如果观察用不同方法得到的结果,可以看出:

在 2019 年,由于购买时的客户更加年轻,因此平均年龄与 2020 年有所不同,也更加真实的反应了业务。

总结

在研究与客户有关的问题时,往往需要在 客户表订单表 之间联动,这就涉及到不少 DAX 技巧,大家可以自行演练实验。

DAX 设计模式(第二版)中文在线学习正式开放

PowerBI 免费技术讲座系列 - BI佐罗专场

财务报告三大表统一及高级分析通用模板 - 数据结构篇

Zebra BI 4.5 发布 - 支持自定义计算

全网首发 PowerBI 全动态中国式复杂矩阵完美增强版 4.0 版

全网首发 PowerBI DAX 支持面向切面超级设计模式共迎 2021

《PowerBI 高级》 - 视频课首发,成为专家必备

在订阅了BI佐罗讲授的《BI真经》之《BI进行时》课程区,除了可以下载本文案例,还可以观看视频讲解。