之前分享了通过切换不同的粒度类型,来动态显示最近的N个粒度期间的数据(PowerBI动态显示最近N期的数据),在这个案例中,用了独立的日期表作为切片器,这个做法也可以进一步优化,改用建立关系的日期粒度表来作为切片器,以便与报表的其他图表交互。
原模型不变,这里将切片器中的字段都改为来自日期粒度表,并写一个度量值:
并用这个度量值作为柱形图的值,未建立的关系的独立日期粒度表作为坐标轴,同样可以实现上篇文章的效果:
此外,最近被星友问到,对于这种动态的粒度,如何选择不同粒度类型,来正确计算出上年同期以及上期的数据呢?
对于上年同期的数据,相对比较简单,只需要这样写一个度量值就可以了:
收入 上年同期=
CALCULATE(
[收入],
CALCULATETABLE(
SAMEPERIODLASTYEAR(日期表[日期]),
TREATAS(VALUES(日期粒度表[日期]),日期表[日期])
),
ALL(日期粒度表)
)
这个度量值的逻辑是将当前日期粒度表所筛选的日期范围,视同日期表的日期范围,并利用时间智能函数返回该范围的上年同期的时间段;当然,为了避免日期粒度表同时筛选,用ALL来忽略掉它。
这样,无论选择任何粒度,都可以轻松计算出上年同期的数据。
计算当前粒度的上期,同样可以使用上面度量值的思路,但是稍微麻烦的一点是,对于不同的粒度,计算上期用到的时间智能函数是不同的,所以还需要先判断当前所选择的粒度类型。
上期的度量值写法如下:
收入 上期 = SWITCH( SELECTEDVALUE(日期粒度表[类型]),"年",[收入 上年同期],"季",CALCULATE([收入],CALCULATETABLE(DATEADD(日期表[日期],-1,QUARTER),TREATAS(VALUES(日期粒度表[日期]),日期表[日期])),ALL(日期粒度表)),"月",CALCULATE([收入],CALCULATETABLE(DATEADD(日期表[日期],-1,MONTH),TREATAS(VALUES(日期粒度表[日期]),日期表[日期])),ALL(日期粒度表)),"日",CALCULATE([收入],CALCULATETABLE(DATEADD(日期表[日期],-1,DAY),TREATAS(VALUES(日期粒度表[日期]),日期表[日期])),ALL(日期粒度表)) )当粒度类型为年时,上期就是上年同期,所以直接用上面建的上年同期度量值,当为其他粒度类型,则通过DATEADD函数来相应的计算该粒度的上期的时间段。
用本期、上期以及上年同期这三个度量值做个柱形图,来看看动态效果:
有上期和上年同期的数据以后,再计算任何粒度的同比和环比也就可以很轻松的实现了。
更多精彩内容
采悟 | PowerBI星球