如何用 PowerBI DAX 度量值控制筛选

2021-12-02 15:39:33 浏览数 (1)

如何用度量值或度量值的范围做切片器或筛选控制,是很通用的,这里给出最佳实践。

用一段 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 结构来表示结果。

0 人点赞