本部分介绍如何在数据分析表达式 (DAX) 公式中创建筛选器。 可以在公式中创建筛选器,以限制计算中使用的源数据中的值。 要执行此操作,可将表指定为公式的输入,然后定义筛选器表达式。 您提供的筛选器表达式用于查询数据并仅返回源数据的子集。 每次更新公式结果时,都会动态应用该筛选器,具体取决于数据的当前上下文。
本文内容
对公式中使用的表创建筛选器
可以在将表格作为输入的公式中应用筛选器。 不输入表名称,而是使用 FILTER 函数定义指定表中的行的子集。 然后,该子集被传递给另一个函数,用于自定义聚合等操作。
例如,假设您有一个包含有关经销商的订单信息的数据表,并且您想要计算每个经销商的销售额。 但是,您希望仅针对销售多件高价值产品的经销商显示销售金额。 以下基于 DAX 示例工作簿的公式显示了如何使用筛选器创建此计算的一个示例:
=SUMX (
FILTER ('ResellerSales_USD', 'ResellerSales_USD'[Quantity] > 5 &&
'ResellerSales_USD'[ProductStandardCost_USD] > 100) ,
'ResellerSales_USD'[SalesAmt]
)
公式的第一部分指定了 Power Pivot 聚合函数之一,该函数采用表作为参数。 SUMX 计算表的总和。
公式的第二部分指示
FILTER(table, expression),SUMX要使用哪些数据。SUMX需要一个表或一个表达式才能生成一个表。 在这里,不是使用表中的所有数据,而是使用FILTER函数指定使用表中的哪些行。
筛选器表达式具有两部分:第一部分命名应用筛选器的表。 第二部分定义用作筛选条件的表达式。 在这种情况下,你筛选的是销售超过 5 个单位的经销商和价格超过 $100 的产品。 运算符 && 是一个逻辑 AND 运算符,它指示条件的两个部分必须为 true,行才能属于筛选的子集。公式的第三部分告诉函数应该
SUMX对哪些值求和。 在这种情况下,仅使用销售额。
请注意,诸如 FILTER 之类的函数返回表从不直接返回表或行,而是始终嵌入到另一个函数中。 有关用于筛选的其他函数的详细信息(包括更多示例),请参阅 DAX) (筛选函数 。注意
筛选器表达式受其使用上下文的影响。 例如,如果您在度量值中使用筛选器,并且该度量值用于数据透视表或数据透视图,则返回的数据子集可能受到用户在数据透视表中应用的其他筛选器或切片器的影响。 有关上下文的详细信息,请参阅 DAX 公式中的上下文。
删除重复项的筛选器
除了筛选特定值之外,还可以从另一个表或列返回一组唯一的值。 当您想要计算列中唯一值的数目或将唯一值列表用于其他操作时,这会很有用。 DAX 提供两个用于返回不同值的函数: DISTINCT 函数 和 VALUES 函数。
- DISTINCT 函数会检查指定为函数参数的单个列,并返回仅包含非重复值的新列。
- VALUES 函数还返回唯一值列表,还返回未知成员。 当您使用通过关系联接的两个表中的值,其中一个表中缺少一个值而另一个表中存在时,此操作非常有用。 有关未知成员的详细信息,请参阅 DAX 公式中的上下文。
这两个函数都返回整列值;因此,您可以使用这些函数获取值列表,然后将其传递给另一个函数。 例如,可以使用以下公式通过唯一产品密钥获取特定经销商销售的不同产品的列表,然后使用 COUNTROWS 函数对该列表中的产品进行计数:
=COUNTROWS (DISTINCT ('ResellerSales_USD'[ProductKey]) )
上下文如何影响筛选器
将 DAX 公式添加到数据透视表或数据透视图时,公式的结果可能会受到上下文的影响。 如果使用 Power Pivot 表,则上下文为当前行及其值。 如果使用数据透视表或数据透视图,则上下文是指由诸如切片或筛选等操作定义的数据集或子集。 数据透视表或数据透视图的设计还会强制实施其自己的上下文。 例如,如果创建一个按地区和年份对销售额进行分组的数据透视表,则数据透视表中将只显示适用于这些地区和年份的数据。 因此,添加到数据透视表的任何度量值都是在列和行标题以及度量值公式中的任何筛选器的上下文中计算的。
有关详细信息,请参阅 DAX 公式中的上下文。
删除筛选器
使用复杂公式时,你可能希望确切地知道当前筛选器是什么,或者可能想要修改公式的筛选器部分。 DAX 提供了几个函数,可用于删除筛选器,并控制将哪些列保留为当前筛选器上下文的一部分。 本节概述了这些函数如何影响公式中的结果。
使用 ALL 函数替代所有筛选器
可以使用该 ALL 函数覆盖以前应用的任何筛选器,并将表中的所有行返回到正在执行聚合或其他操作的函数。 如果使用一个或多个列(而不是表格)作为 的ALL参数ALL,则该函数返回所有行,忽略任何上下文筛选器。
注意
如果您熟悉关系数据库术语,则可以视 ALL 为生成所有表的自然左外联。
例如,假设你有表 Sales and Products,并且想要创建一个公式,用于计算当前产品的总销售额除以所有产品的销售额。 您必须考虑以下事实,即如果在度量值中使用该公式,则数据透视表的用户可能正在使用切片器筛选特定产品,并将产品名称放在行上。 因此,若要获取分母的真实值而不考虑任何筛选器或切片器,必须添加 ALL 函数来替代所有筛选器。 以下公式是如何使用 ALL 覆盖先前筛选器的效果的一个示例:
=SUM (Sales[Amount]) /SUMX (Sales[Amount], FILTER (Sales, ALL (Products) ) )
- 公式的第一部分 SUM (Sales[Amount]) 用于计算分子。
- 该求和将考虑当前上下文,这意味着,如果将公式添加到计算列中,则应用行上下文,并且如果将公式作为度量值添加到数据透视表中,则将应用数据透视表 (筛选器上下文) 中应用的任何筛选器。
- 公式的第二部分,计算分母。 ALL 函数覆盖可能应用于
Products表格的任何筛选器。
有关详细信息,包括详细示例,请参阅 ALL 函数。
使用 ALLEXCEPT 函数替代特定筛选器
ALLEXCEPT 函数也会替代现有筛选器,但你可以指定保留某些现有筛选器。 命名为 ALLEXCEPT 函数参数的列指定将继续筛选哪些列。 如果要覆盖大多数列(但不是全部)的筛选器,则 ALLEXCEPT 比 ALL 更方便。 在创建可能针对许多不同列进行筛选的数据透视表,并且希望控制公式中使用的值时,ALLEXCEPT 函数尤其有用。 有关详细信息,包括如何在数据透视表中使用 ALLEXCEPT 的详细示例,请参阅 ALLEXCEPT 函数。