[知识体系] 理解 ISFILTERED 和 ISCROSSFILTERED

  [复制链接]
查看100624 | 回复115 | 2021-2-21 18:59:23 | 显示全部楼层 |阅读模式
这是两个非常有用的函数,可以帮助你更好地理解筛选上下文的传递。此外,对它们的学习还可以引入一个 DAX 中十分有趣的概念,即如何从 DAX 内部检测正在被计算的单元格。
认识 ISFILTERED 函数

这两个函数的用途是检测列的所有值在当前筛选上下文中是否可见,理解了直接筛选(Direct-Filter)和交叉筛选(Cross-Filter)的区别,你就理解了这两个函数的作用。

ISFILTERED
  1. ISFILTERED ( <TableNameOrColumnName> )
复制代码

返回 TRUE 或 FALSE,取决于作为参数的列是否被直接筛选,也就是说,参数列已经被放在行、列、切片器或筛选器上,并且正在对当前计值区域¹进行筛选。


当使用表作为参数时,只要表中的任意一列被直接筛选,ISFILTERED 返回 TRUE。


¹计值区域:图表的值区域,比如透视表、表格和矩阵的单元格等。

ISCROSSFILTERED
  1. ISCROSSFILTERED ( <TableNameOrColumnName> )
复制代码

返回 TRUE 或 FALSE,取决于列是否具有经过传递的筛选,而不是由于此列有一个直接筛选条件。
自 SSAS 2019 或 Power BI 2019 年 4 月的版本之后,ISFILTERED 可以使用表作为参数,以前的版本只支持列参数
函数示例

  1. -- 以下查询返回 FALSE
  2. EVALUATE { CALCULATE ( ISFILTERED ( Sales ), 'Product'[Color] = "Red" ) }
  3. EVALUATE { CALCULATE ( ISFILTERED ( Sales[Quantity] ), 'Product'[Color] = "Red" ) }
  4. EVALUATE { CALCULATE ( ISFILTERED ( Sales[Quantity] ), Sales[Unit Price] > 10 ) }

  5. -- 以下查询返回 TRUE
  6. EVALUATE { CALCULATE ( ISFILTERED ( Sales ), Sales[Unit Price] > 10 ) }
  7. EVALUATE { CALCULATE ( ISFILTERED ( Sales[Unit Price] ), Sales[Unit Price] > 10 ) }
复制代码
实战案例

在本节中,我们感兴趣的是如何使用函数来理解筛选上下文的传递。因此,我们将创建虚构的表达式,将其作为学习 DAX 的工具,如果你用这个定义创建一个新度量值:
  1. [CategoryFilter] := ISFILTERED ( 'Product Category'[Category])
复制代码

这个简单的度量值返回应用于产品类别的 ISFILTERED 函数的结果。之后你可以创建第二个度量值,用产品颜色进行相同的测试:
  1. [ColorFilter] := ISFILTERED ( Product[ColorName] )
复制代码

如果将这两个度量值添加到透视表中,将类别放在切片器,并将颜色放在行上,结果如图所示。


7106211936391.jpeg

类别没有被筛选,而颜色被逐行筛选,只有总计行例外


有趣的是,类别未被筛选,因为即使我们添加了切片器,我们也没有对它进行选择。另一方面,颜色总是在行上进行筛选,因为每一行都有特定的颜色,而总计不包括在内,因为总计行对应的是全部筛选上下文,不包含任何产品选择。
总计的这种特征,即不应用来自行和列的筛选器,在你想修改公式行为时非常有用,比如针对总计显示一个不同的值。事实上,ISFILTERED 可以用作透视表报表的属性检查,以便理解正在计值的单元格是否在透视表内部或者是否位于总计行,

如果现在从类别切片器中选择一些值,结果会发生变化。因为现在类别中总是有一个筛选器,如下图。事实上,即使在透视表的汇总行上,切片器引入的筛选上下文也是有效的。


7106211936392.jpeg

切片器引入的筛选条件对总计行仍然有效


ISFILTERED 对于检测那些直接应用于某列的筛选器非常有用。但在另外一些情况下,一列不显示所有值,不是因为你正在筛选该列,而是因为你在其他列上设置了筛选器。例如,如果你筛选颜色,并计算产品品牌的数量,那么你将只得到该特定颜色产品的品牌数。当一个列因为另一列上的筛选器被筛选时,我们说该列是被交叉筛选的ISCROSSFILTERED 函数被用来检测这种情况。


如果你在数据模型中加入这两个新的度量值,检查颜色和类别的交叉筛选情况:
  1. [CrossCategory] := ISCROSSFILTERED( 'ProductCategory'[Category] )

  2. [CrossColor] := ISCROSSFILTERED ( Product[Color] )
复制代码

你会看到这样的结果


7106211936393.jpeg

使用 ISCROSSFILTERED 可以观察到交叉筛选的发生


你可以看到颜色是被交叉筛选的,但类别不是。对于这个现象,一个有趣的问题是“为什么类别没有被筛选?”当你筛选颜色时,你可能希望只看到特定颜色的产品类别。要回答这个问题,你需要记住类别不是产品表的列。相反,它是产品类别表的一部分,关系的方向无法实现你想要的传递方式。如果你更改数据模型,将产品表和产品类别表之间的关系设置为双向筛选,那么结果将有所不同。


7106211936394.jpeg

启用双向筛选表明,类别被交叉筛选了, 即使没有直接筛选


在本节中,你已经看到了一些 ISFILTERED 和 ISCROSSFILTERED 的示例,使用这些示例主要出于教学演示目的,是为了更好地帮助你理解筛选上下文如何通过关系进行传递。随着 DAX 水平的提高,通过编写高级 DAX 代码,你将了解为什么这两个函数如此有用。
回复

使用道具 举报

open168 | 2021-4-24 15:27:04 | 显示全部楼层
支持,一直很喜欢老师的课程
回复

使用道具 举报

深海 | 2021-6-21 11:59:51 来自手机 | 显示全部楼层
1v1飘过
回复

使用道具 举报

zdaye | 2021-8-5 22:37:27 来自手机 | 显示全部楼层
老大,这个说的很好,这个真不错!
回复

使用道具 举报

xoco | 2021-8-16 15:36:37 | 显示全部楼层
不错 支持下
回复

使用道具 举报

hijackhan | 2021-9-28 11:56:22 来自手机 | 显示全部楼层
佩服佩服!
回复

使用道具 举报

小兵张噶 | 2021-11-23 07:32:32 来自手机 | 显示全部楼层
顶顶更健康
回复

使用道具 举报

67198194 | 2021-12-2 18:17:38 来自手机 | 显示全部楼层
顶起出售广告位
回复

使用道具 举报

马自达 | 2022-2-3 15:10:21 来自手机 | 显示全部楼层
顶顶更健康
回复

使用道具 举报

原野 | 2022-3-7 11:39:37 | 显示全部楼层
沙发~支持云发教育
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则