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

理解 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 )
)

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

 

6
说点什么

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

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

成员
139****3605

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

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数