Power BI如何计算非日期维度的同比环比?
对于自然日期维度的业务数据,在PowerBI中可以轻松的使用时间智能函数来进行各种时间指标的计算(各种时间指标的度量值,让你一次看个够),但如果不是按标准的日历,甚至都没有日期维度,该怎么计算呢?
比如下面这个业务数据,每个订单时间并不是按日期来区分的,而是按期间来划分,一年划分为6个期间,分别为P1、P2……
上面的数据连个日期维度都没有,如何计算每一期的同比和环比呢?
其实计算逻辑与日期维度并没有什么不同,日期计算需要有个日期表,非日期的期间计算,同样也需要制作一个期间维度表。
期间维度表与订单表建立关系:
然后根据计算的需要建立几个度量值就可以了。
本期收入 = SUM( '订单表'[销售额] )
上期收入,就是年度相同,期间编号减1的期间的数据,按照这个逻辑写度量值如下:
上期收入 =
VAR year_ = SELECTEDVALUE( '期间表'[年度] )
VAR period_ =SELECTEDVALUE( '期间表'[期间编号] )
RETURN
CALCULATE(
[本期收入] ,
FILTER(
ALL( '期间表' ) ,
'期间表'[年度] = year_ && '期间表'[期间编号] = period_-1
)
)
结果如下:
上图中的结果中,大部分的上期收入没有问题,但是2018年第1期的收入为空,这是因为按照上面的逻辑,第1期的编号减1的期间是不存在的,所以导致这样的结果。
解决这个问题,可以判断是否为第一期来修正计算的逻辑,不过更简单的办法是,在期间表添加一个连续的期间序号维度,
有了这个序号,不用考虑年度,每一期的上期,就是期间序号减1的期间,修正度量值如下:
上期收入=
VAR period_ =SELECTEDVALUE( '期间表'[期间序号] )
RETURN
CALCULATE(
[本期收入] ,
FILTER( ALL( '期间表' ) , '期间表'[期间序号] = period_-1 )
)
这个度量值看起来简单多了,并且计算结果也是我们需要的:
同样的逻辑,计算上年同期的数据,就是期间序号减去6的期间,度量值如下:
上年同期收入 =
VAR period_ =SELECTEDVALUE( '期间表'[期间序号] )
RETURN
CALCULATE(
[本期收入] ,
FILTER( ALL( '期间表' ) , '期间表'[期间序号] = period_-6 )
)
结果如下:
有了上期和上年同期的数据,计算同比和环比就很简单了:
环比 = DIVIDE( [本期收入]-[上期收入] , [上期收入] )
同比 = DIVIDE( [本期收入]-[上年同期收入] , [上年同期收入] )
这样就完成了同比和环比的指标计算。
这篇文章介绍的是一个普遍意义上的时间指标计算思路,无论是可以利用时间智能函数的月度、季度同比环比,还是没有时间智能函数的周、旬等维度的同比环比,都可以按这个思路轻松实现。
如果彻底理解了这种算逻辑,并掌握了DAX表达思路,再碰到各种日历的指标计算,都可以迎刃而解。
之前写过的周分析以及非标准日历,也是同样的计算逻辑: