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

ISFILTERED 和 ISCROSSFILTERED

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

认识 ISFILTERED 函数

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

ISFILTERED

ISFILTERED ( <TableNameOrColumnName> )

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

ISCROSSFILTERED

ISCROSSFILTERED ( <TableNameOrColumnName> )

返回 TRUE 或 FALSE,取决于列是否具有经过传递的筛选,而不是由于此列有一个直接筛选条件。

自 SSAS 2019 或 Power BI 2019 年 4 月的版本之后,ISFILTERED 可以使用表作为参数,以前的版本只支持列参数

函数示例

-- 以下查询返回 FALSE
EVALUATE { CALCULATE ( ISFILTERED ( Sales ), 'Product'[Color] = "Red" ) }
EVALUATE { CALCULATE ( ISFILTERED ( Sales[Quantity] ), 'Product'[Color] = "Red" ) }
EVALUATE { CALCULATE ( ISFILTERED ( Sales[Quantity] ), Sales[Unit Price] > 10 ) }
 
-- 以下查询返回 TRUE
EVALUATE { 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] )

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

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

有趣的是,类别未被筛选,因为即使我们添加了切片器,我们也没有对它进行选择。另一方面,颜色总是在行上进行筛选,因为每一行都有特定的颜色,而总计不包括在内,因为总计行对应的是全部筛选上下文,不包含任何产品选择。

总计的这种特征,即不应用来自行和列的筛选器,在你想修改公式行为时非常有用,比如针对总计显示一个不同的值。事实上,ISFILTERED 可以用作透视表报表的属性检查,以便理解正在计值的单元格是否在透视表内部或者是否位于总计行,

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

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

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

如果你在数据模型中加入这两个新的度量值,检查颜色和类别的交叉筛选情况:

[CrossCategory] := ISCROSSFILTERED( 'ProductCategory'[Category] )

[CrossColor] := ISCROSSFILTERED ( Product[Color] )

你会看到这样的结果

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

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

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

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

 

说点什么

avatar
1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
  订阅本文评论  
提醒