语法
指定 DAX 表达式计算时使用的交叉筛选方向
CROSSFILTER(<columnName1>, <columnName2>, <direction>)
函数不返回任何值,仅在计算期间为指定的关系设置交叉筛选方向。<columnName>必须是完全限定的,已存在的物理列名称,不能使用表达式。<columnName1>使用位于多端的列,<columnName2>使用位于一端的列,不过即使颠倒顺序,函数在计值时也会自动调整。
<direction>有三种设置
- ONEWAY(1):单向筛选
- BOTH(2):双向筛选
- NONE:无交叉筛选
注意
- 在一对一关系的情况下,设定 ONEWAY 和 BOTH 的效果相同。
- CROSSFILTER 只能在接受筛选器作为参数的函数中使用,例如:
- CALCULATE 和 CALCULATETABLE
- CLOSINGBALANCEMONTH, CLOSINGBALANCEQUARTER, CLOSINGBALANCEYEAR, OPENINGBALANCEMONTH, OPENINGBALANCEQUARTER, OPENINGBALANCEYEAR
- TOTALMTD,TOTALQTD 和 TOTALYTD
- CROSSFILTER 使用模型中的现有关系,通过使用关系两端的列标识关系。
- 在 CROSSFILTER 中,模型关系的交叉筛选设置并不重要;也就是说,在模型中将关系设置为单向或双向筛选不会影响函数的使用,CROSSFILTER 将覆盖任何现有的交叉筛选设置。
- 如果命名为参数的任何列不是关系的一部分,或者参数属于不同的关系,会返回错误。
- 对于嵌套的 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是最佳选择
这个函数的作用是没有对KEY列连线时通过该函数可以实现这个连线的功能?
老师,产品子类是产品表的扩展表,筛选brand可以得到不重复的产品子类吧?为什么还要用crossfilter呢
请问老师:crossfilter的示例,是不是意味着行上下文转换为筛选上下文的时候,这个筛选上下文不含扩展表的部分,只包含本表。