在使用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,欢迎讨论,欢迎关注