之前的一个订单报告中,用户要求数据显示最近12个月的数据。很简单的,就在 filter里面加入了关于Date的Relative date,最近12个月(包括今天)

然后都做好了,准备上线了。用户说,希望默认打开报表的情况下,显示的是最近12个月的数据,然后之前的数据,我们还是想也能够看到并选择的。
像我说的,除非不想做,没有啥做不了的~~但要上线了,然后这样那样这样那样,要喝点可乐压压惊。做,还是必须要做的。

对于一个懒胖子(不小心又长了10斤的胖子),一想到要修改报表中的所有相关的度量值,胖子第一反应就是拒绝。然后就推出了胖子的第一个修改版本。用Bookmark。


在点击Select Period按钮之前,需要清空掉Date里面的内容。胖子贴心的加了tooltips。

唉,效果一般。因为还是有人会忘记在清掉Date里面的选择。为啥不用Bookmark里面Data选项?因为还有其他的slicer,我们希望在使用bookmark的时候保留Slicer Data上的筛选值。如果用了Data选项,所有的filter都会被一起干掉。
然后,中间经过了一些挣扎,最后,还是用了修改所有度量的方法。

报表显示如下:
一个Slicer,包括Year和Year Month信息
一个by Order Month的Quantity的图

创建度量值如下:
Order Quantity =
var _maxdate = CALCULATE(MAX(Sales[Order Date]),ALL(Sales))
var _last12month = EDATE(_maxdate,-12)-2
return
IF(
OR(ISFILTERED('Date Time'[Year Month]),ISFILTERED('Date Time'[Year])),
SUM(Sales[Quantity]),CALCULATE(SUM(Sales[Quantity]),FILTER('Date Time','Date Time'[Date]>_last12month)))
因为例子中Sale表的Order Date的日期范围是2007年1月到2009年12月,所以这里用了CALCULATE(MAX(Sales[Order Date]),ALL(Sales))。如果有最新数据的条件下,可以直接用Today()这个函数。把下面这句替换上去就可以了。
VAr _last12month = EODATE(TODAY(),-12)-2
如果不小心,还有未来的数据,记得加入
SUM(Sales[Quantity]),CALCULATE(SUM(Sales[Quantity]),FILTER('Date Time',and('Date Time'[Date]>_last12month,'Date Time'[Date]<=Today())))
具体问题具体分析。
当选择了全部的日期,就会显示全部日期的值。

如果选择了部分日期,就会得到部分日期的值

其实这个需求也不是很难。主要是抓取对到日期的直接筛选,然后展示不同的计算结果。
不过这里有个Power BI工具本身的局限性。对于Slicer里面,我们是分不出select nothing (就是默认什么都不选)和select all的。
这里select all是下面这个控件选项的意思。

在报表用的体现是下图的 Select all

ISFILTERED抓不到Select all和select nothing的区别。我也想过用count slicer里面的value的方法,也是分不出Select all和select nothing。也问了微软的support,没有区分的方法。
虽然在工具上有这个局限性,但是,如上例,在Date的Slicer中加入了Year这个group。这样对用户来说,也不用一个一个Year Month的选那么麻烦。可以相对简单的实现选择select all的功能。还好~~

每天进步一点就好~~要是每天多赚一点就更好了~~哈哈哈
