从数据到信息
从信息到洞察

理解 CROSSFILTER

语法

指定 DAX 表达式计算时使用的交叉筛选方向

CROSSFILTER(<columnName1>, <columnName2>, <direction>)

函数不返回任何值,仅在计算期间为指定的关系设置交叉筛选方向。<columnName>必须是完全限定的,已存在的物理列名称,不能使用表达式。<columnName1>使用位于多端的列,<columnName2>使用位于一端的列,不过即使颠倒顺序,函数在计值时也会自动调整。

<direction>有三种设置

  • ONEWAY(1):单向筛选
  • BOTH(2):双向筛选
  • NONE:无交叉筛选

注意

  1. 在一对一关系的情况下,设定 ONEWAY 和 BOTH 的效果相同。
  2. CROSSFILTER 只能在接受筛选器作为参数的函数中使用,例如:
    • CALCULATE 和 CALCULATETABLE
    • CLOSINGBALANCEMONTH, CLOSINGBALANCEQUARTER, CLOSINGBALANCEYEAR, OPENINGBALANCEMONTH, OPENINGBALANCEQUARTER, OPENINGBALANCEYEAR
    • TOTALMTD,TOTALQTD 和 TOTALYTD
  3. CROSSFILTER 使用模型中的现有关系,通过使用关系两端的列标识关系。
  4. 在 CROSSFILTER 中,模型关系的交叉筛选设置并不重要;也就是说,在模型中将关系设置为单向或双向筛选不会影响函数的使用,CROSSFILTER 将覆盖任何现有的交叉筛选设置。
  5. 如果命名为参数的任何列不是关系的一部分,或者参数属于不同的关系,会返回错误。
  6. 对于嵌套的 CALCULATE 表达式,并且包含多个 CROSSFILTER 函数的时候,最内层的 CROSSFILTER 将覆盖外层设置。

示例用法

Product Subcategory 和 Product 存在一对多的关系,如下所示

如果想按 Product 表的品牌列统计对应的产品子类别的数量,在不激活双向关系的情况下,你需要使用 CROSSFILTER 指定计算发生时 CALCULATE 使用的筛选方向。

默认的计数无法统计准确数量

CROSSFILTER =
CALCULATE (
    DISTINCTCOUNT ( 'Product Subcategory'[Subcategory] ),
    CROSSFILTER ( 'Product'[ProductSubcategoryKey], 'Product Subcategory'[ProductSubcategoryKey], BOTH )
)

Bug

CROSSFILTER 只适用于活动关系,对非活动关系不生效。但目前对非活动的判定仅限于关系的原始状态,不考虑使用 USERELATIONSHIP 提升关系权重导致活动关系降为不活动关系的情况(这种情况下仍然被 CROSSFILTER 判定为活动关系)。

----------------------Based on Contoso.pbix-----------------------------
--------------Active Relationship base on Sales[OrderDateKey]-----------
EVALUATE
CALCULATETABLE (
    VALUES ( 'Date'[Date]),
    USERELATIONSHIP ( 'Date'[DateKey], SALES[DeliveryDateKey] ),
    CROSSFILTER ( 'Date'[DateKey], Sales[OrderDateKey], 2 ),
    Sales[Order Date] = DATE ( 2007, 12, 31 )
)

上面的示例中,默认的活动关系使用下单日期,由于 USERELATIONSHIP 的使用,下单日期已经不是活动关系,但 CROSSFILTER 仍然生效,结果返回下单日期在 12.31 对应的 5 个发货日期。

Bug 首次发现于 2024 年 11 月,目前尚未修复,如发现修复,欢迎留言反馈

如果是出于性能考虑,不建议你在模型中将关系的筛选方向设置为双向,这会减慢报表的运行速度。在公式中使用CROSSFILTER是最佳选择

 

10
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
4 评论数
8 被回复的评论
6 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
简单

这个函数的作用是没有对KEY列连线时通过该函数可以实现这个连线的功能?

成员
139****3194

老师,产品子类是产品表的扩展表,筛选brand可以得到不重复的产品子类吧?为什么还要用crossfilter呢

成员
139****3605

请问老师:crossfilter的示例,是不是意味着行上下文转换为筛选上下文的时候,这个筛选上下文不含扩展表的部分,只包含本表。

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数