10.3 ISFILTERED 和 ISCROSSFILTERED

这是两个非常有用的函数,可以帮助你更好地理解筛选上下文的传递。此外,对它们的学习还可以引入一个DAX中十分有趣的概念,即如何从DAX内部检测正在被计算的单元格。

认识ISFILTERED函数

这两个函数的用途是检测列的所有值在当前筛选上下文中是否可见,理解了直接筛选(Direct-Filter)和交叉筛选(Cross-Filter)的区别,你就理解了这两个函数的作用。### ISFILTERED ISFILTERED ( )返回TRUE或FALSE,取决于作为参数的列是否被直接筛选,也就是说,它已经被放在行、列、切片器或筛选器上,并且正在对当前单元格进行筛选。### ISCROSSFILTERED ISCROSSFILTERED ( )返回TRUE或FALSE,取决于列是否具有经过传递的筛选,而不是由于此列有一个直接筛选条件。自SSAS 2019或Power BI 2019年4月的版本之后,ISFILTERED可以使用表作为参数,以前的版本只支持列参数### 函数示例 — 以下查询返回FALSEEVALUATE{CALCULATE(ISFILTERED(Sales),’Product’[Color]=”Red”)}EVALUATE{CALCULATE(ISFILTERED(Sales[Quantity]),’Product’[Color]=”Red”)}EVALUATE{CALCULATE(ISFILTERED(Sales[Quantity]), Sales[Unit Price]>10)}— 以下查询返回TRUEEVALUATE{CALCULATE(ISFILTERED(Sales), Sales[Unit Price]>10)}EVALUATE{CALCULATE(ISFILTERED(Sales[Unit Price]), Sales[Unit Price]>10)}## 实战案例 在本节中,我们感兴趣的是如何使用函数来理解筛选上下文的传递。因此,我们将创建虚构的表达式,将其作为学习DAX的工具,如果你用这个定义创建一个新度量值:[CategoryFilter]:=ISFILTERED(‘Product Category’[Category])这个简单的度量值返回应用于产品类别的ISFILTERED函数的结果。之后你可以创建第二个度量值,用产品颜色进行相同的测试:[ColorFilter]:=ISFILTERED(Product[ColorName])如果将这两个度量值添加到透视表中,将类别放在切片器,并将颜色放在行上,结果如图所示。10.3 ISFILTERED 和 ISCROSSFILTERED - 图1类别没有被筛选,而颜色被逐行筛选,只有总计行例外有趣的是,类别未被筛选,因为即使我们添加了切片器,我们也没有对它进行选择。另一方面,颜色总是在行上进行筛选,因为每一行都有特定的颜色,而总计不包括在内,因为总计行对应的是全部筛选上下文,不包含任何产品选择。总计的这种特征,即不应用来自行和列的筛选器,在你想修改公式行为时非常有用,比如针对总计显示一个不同的值。事实上,ISFILTERED可以用作透视表报表的属性检查,以便理解正在计值的单元格是否在透视表内部或者是否位于总计行,如果现在从类别切片器中选择一些值,结果会发生变化。因为现在类别中总是有一个筛选器,如下图。事实上,即使在透视表的汇总行上,切片器引入的筛选上下文也是有效的。10.3 ISFILTERED 和 ISCROSSFILTERED - 图2切片器引入的筛选条件对总计行仍然有效ISFILTERED对于检测那些直接应用于某列的筛选器非常有用。但在另外一些情况下,一列不显示所有值,不是因为你正在筛选该列,而是因为你在其他列上设置了筛选器。例如,如果你筛选颜色,并计算产品品牌的数量,那么你将只得到该特定颜色产品的品牌数。当一个列因为另一列上的筛选器被筛选时,我们说该列是被交叉筛选的,ISCROSSFILTERED函数被用来检测这种情况。如果你在数据模型中加入这两个新的度量值,检查颜色和类别的交叉筛选情况:[CrossCategory]:=ISCROSSFILTERED(‘ProductCategory’[Category])[CrossColor]:=ISCROSSFILTERED(Product[Color])你会看到这样的结果10.3 ISFILTERED 和 ISCROSSFILTERED - 图3使用ISCROSSFILTERED可以观察到交叉筛选的发生你可以看到颜色是被交叉筛选的,但类别不是。对于这个现象,一个有趣的问题是“为什么类别没有被筛选?”当你筛选颜色时,你可能希望只看到特定颜色的产品类别。要回答这个问题,你需要记住类别不是产品表的列。相反,它是产品类别表的一部分,关系的方向不允许关系按你想要的方式传递。如果你更改数据模型,将产品表和产品类别表之间的关系设置为双向筛选,那么结果将不同。10.3 ISFILTERED 和 ISCROSSFILTERED - 图4启用双向筛选表明,类别被交叉筛选了, 即使没有直接筛选在本节中,你已经看到了一些ISFILTERED和ISCROSSFILTERED的示例,使用这些示例主要出于教学演示目的,是为了更好地帮助你理解筛选上下文如何通过关系进行传递。随着DAX水平的提高,通过编写高级DAX代码,你将了解为什么这两个函数如此有用。