暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PowerBI趋势图展示前N个月

BISeven 2021-11-19
1426

在使用PowerBI展示销量(为了方便说明)的趋势图时,可能需要如下的一种展示方式:当时间切片器选择某个月份时,趋势图需要展示该月份前N个月(比如12个月),那这个时候该怎么办呢?

 

如下图中的,无论切片器中的月份选择的是几月份,趋势图中展示都是向前滚动12个月

 

我们分析一下如果要达到这个效果,需要满足什么条件?

1. 切片器中的月份与图表中的月份得不能是同一个字段,不然的话,切片器中的月份是哪个,轴上的月份就显示哪个,达不到向前滚动的效果。

即,切片器中的年月来自于日期表,而趋势图中的年月来自于另一张表

2. 趋势图中的每个月份还必须要能筛选模型,才能计算出对应月份的结果。


1. 根据第一点,我们需要建立一张新的包含年月的表:

discDateTable = all('日期表'[年月])

2. 根据第二点,当我们迭代轴上的年月时,要去计算对应的销量,这个度量值该怎么写?

Sales2 =

CALCULATE([sales], TREATAS(values(discDateTable[年月]),'日期表'[年月])))

 

只要我们利用treatas函数将新表上的年月筛选器传递到日期表上,这样在迭代计算趋势图中的每月时,就计算出相应月份的销量。如下图

3. 但是,无论我们选择哪个月份,趋势图都会展示全部月份的销量,不满足我们向前滚动12个月的要求。在PowerBI中有个特性:如果某个月份的度量值计算结果为空,就不显示。我们就可以利用这个特性完成我们的需求,我们要求计算的是向前滚动12个月,只有在年月满足这个条件才能计算,否则不计算,这样是不是就能满足要求了?

完整的代码如下:

sales3 =
var nth = 12
var max_date = LASTDATE('日期表'[日期]) // 返回选择日期中的最大的日期
var min_date = DATEADD(max_date, -nth, month) // 计算最大日期对应的最小日期
var display_months = CALCULATETABLE(VALUES('日期表'[年月]), '日期表'[日期] <= max_date, '日期表'[日期] > min_date) // 计算最小日期最大日期之间的年月
var iter_disc_date = SELECTEDVALUE(discDateTable[年月]) // 迭代年月
Return
IF(iter_disc_date in display_months,
CALCULATE([sales], TREATAS(values(discDateTable[年月]),'日期表'[年月])))

在上述的DAX中Return前面定义的5个变量实际上就是为了找到需要显示的年月。这样就能满足我们的需求了


 

总结

为了能够实现展现特定范围内(月份/天)的数据,可以分三步:

1. 新建一张表,与原始模型不建立关系

2. 确定要展示的范围(在度量值中定义哦)

3. 利用treatas函数将新表与原模型建立关系(在度量值中定义)

 

好了,我是BISeven,欢迎交流

 

我是BISeven,欢迎讨论,欢迎关注

文章转载自BISeven,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论