上述案例反应了用户选择了一个日期,然后所有的数据计算以该日期为基准,只显示最近 X 天的,X 由滑竿切片器给定。
如图所示,默认情况下 PowerBI 无法让人选择单个日期,但在现实中,这个需求非常常见,现在来实现之。
先用 DAX 构建这个日期滑竿,如下:
DatePicker =
SELECTCOLUMNS(
GENERATESERIES( DATE( 2019 , 1 , 1 ) , DATE( 2019 , 12 , 31 ) , 1 ) ,
"Date" , [Value]
)
拖拽到界面,如下:
它的问题在于:
要实现单日期框效果,需要对滑竿做 3 个简单设置:
于是可以得到:
这里要实现单日期选择框控件,因此加入一些点缀,如下:
其实现方式只需要使用组合即可,如下:
这样,我们就可以复用这个自己构造的控件了。
首先看下效果:
这里直接给出度量值的写法:
KPI.ByDatePicker =
VAR vDateSelected = MIN( 'Var.DateList'[Date] )
VAR vDateContext = SELECTEDVALUE( Model_Calender[日期] )
RETURN
IF(
vDateContext >= ( vDateSelected - [X.Value] ) &&
vDateContext <= vDateSelected ,
[KPI.Auto]
)
这样就可以实现按 日期选择 以及 时间天数 的筛选效果。
但问题是,每个原有的 KPI 都需要针对日期选择框写一个 ByDatePicker 版的 KPI,这违反了 DRY 原则。也是我们不能接受的,为此,我们来考虑一个优化方案。
先看下效果:
这里采用的方法是:度量值用做筛选器。
这是 PowerBI 的一个重要特性,可以用度量值作为筛选器。下面给出其实现。
先实现一个基本度量值:
DatePicker.Date = MIN( 'DatePicker'[Date] )
这也许在其他场景也可以用得上。
这是最重要的度量值:
DatePicker.IsValid =
// 依赖于 X 选择器
VAR vDatePoint = [DatePicker.Date]
VAR vDateRange =
DATESINPERIOD( DatePicker[Date] , vDatePoint , -[Var.X.Value] , DAY )
VAR vDateInContext = SELECTEDVALUE( Model_Calender[日期] )
RETURN ( vDateInContext IN vDateRange ) + 0
这里面涉及 3 个技巧:
作为一个思考题留给读者,这里为何要返回:
( vDateInContext IN vDateRange ) + 0 而不是 ( vDateInContext IN vDateRange ) 呢?
本文从零构建了单日期选择器并给出了很有效的案例来将此应用通用化。
有些 PowerBI 自身的原生功能,经过一定改良就可以实现不错的效果哦,本文只是一个开始。