如何用度量值或度量值的范围做切片器或筛选控制,是很通用的,这里给出最佳实践。
用一段 Power BI 以后,就会发现有个特点:用切片器可以筛选某个表列。但有时候,需要用度量值来控制筛选。
案例
如下:
对此,要筛选满足一定条件利润的客户。
用度量值作为筛选器 - 在视觉对象中
第一种场景,用度量值作为筛选器,且该度量值在视觉对象中。
可以直接用度量值作为筛选器,如下:
在筛选器面板可以直接使用视觉对象中已有的度量值来进行筛选。
用度量值作为筛选器 - 未在视觉对象中
第二种场景,用度量值作为筛选器,且该度量值不在视觉对象中。
但某些时候我们可能希望用视觉对象中没有的度量值作为筛选器。如下:
度量值 [KPI.利润]
不在视觉对象中,而度量值 [KPI.利润率]
在视觉对象中,这里用 [KPI.利润]
来作为条件筛选该视觉对象。
用度量值作为筛选器 - 直接用度量值控制
第三种场景,用度量值作为筛选器,且该度量值只能作为筛选器。
这是一种最复杂的场景,也是一种最强大和灵活的场景,那就是用一个度量值来承担筛选的工作,而该度量值没有任何其他业务意义。
先看一个例子,我们希望实现:
筛选:该用户买过 5 个商品且最后 30 天有消费的客户,且显示他们对应的指标。
写成度量值,如下:
代码语言:javascript复制筛选:该用户买过5个商品且最后30天有消费 =
COUNTROWS( VALUES('Order'[ProductID] ) ) > 5 &&
[信息-最后交易日-全局] - [信息-最后交易日] <= 30
// 其中
信息-最后交易日-全局 =
MAXX( ALL('Order'[OrderDate] ) , [OrderDate] )
该度量值还有两个条件,在这两个条件都为真时,整体返回真,也就是 TRUE,否则返回 FALSE。
将该过程放到矩阵中,如下:
问题来了,发现:
点击【筛选面板】【复杂条件】的【下箭头】时无反应。根据经验,==Power BI 的筛选器面板中的筛选条件并不能针对 TRUE / FALSE 结构结果的度量值做出筛选控制 ==。
因此,我们需要一个技巧。
度量值用作筛选的终极技巧
让度量值用作筛选的终极技巧就是:
- 将筛选逻辑写入该度量值;
- 筛选逻辑可以是任意复杂的;
- 用数字而非 TRUE / FALSE 结构返回筛选结果。
针对最后一条,可以用 0 / 1 来表示这个结果。
上述案例可以改变如下:
代码语言:javascript复制筛选:该用户买过5个商品且最后30天有消费.正确版本 =
IF(
COUNTROWS( VALUES('Order'[ProductID] ) ) > 5 &&
[信息-最后交易日-全局] - [信息-最后交易日] <= 30
,
1 , 0
)
效果如下:
筛选效果得到了正确保障。
总结
通过本文,我们发现:
- 维度可以被维度值筛选;
- 维度可以被度量值筛选。
前者很容易理解,后者有着重要意义,且表现为:
- 度量值放在视觉对象中;
- 度量值不在视觉对象中;
- 度量值用作专用筛选器。
且度量值用作专用筛选器具有普遍价值,其实践技巧在于:
- 将任意复杂逻辑写入;
- 且让度量值返回 0 / 1 结构来表示结果。