本部分介绍如何在数据分析表达式 (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)从不直接返回表或行,但始终嵌入到另一个函数中。 有关 FILTER 和其他用于筛选的函数的详细信息(包括更多示例),请参阅 筛选函数 (DAX)。
注意: 筛选器表达式受使用它的上下文的影响。 例如,如果在度量中使用筛选器,并且度量值在数据透视表或数据透视图中使用,则返回的数据子集可能会受到用户在数据透视表中应用的其他筛选器或切片器的影响。 有关上下文的详细信息,请参阅 DAX 公式中的上下文。
用于删除重复项的筛选器
除了筛选特定值之外,还可以从另一个表或列返回一组唯一值。 如果要计算列中唯一值的数量,或者对其他操作使用唯一值列表,这非常有用。 DAX 提供两个函数用于返回非重复值: DISTINCT 函数 和 VALUES 函数。
-
DISTINCT 函数检查指定为函数参数的单个列,并返回仅包含非重复值的新列。
-
VALUES 函数还返回唯一值的列表,但也返回 Unknown 成员。 如果使用两个表中的值(这些值由关系联接),并且一个表中缺少值,另一个表中存在值,则这非常有用。 有关未知成员的详细信息,请参阅 DAX 公式中的上下文。
这两个函数都返回整个值列;因此,可以使用 函数获取随后传递给另一个函数的值列表。 例如,可以使用以下公式获取特定经销商销售的不同产品的列表,使用唯一的产品密钥,然后使用 COUNTROWS 函数对该列表中的产品进行计数:
=COUNTROWS (DISTINCT ('ResellerSales_USD'[ProductKey]) )
上下文如何影响筛选器
将 DAX 公式添加到数据透视表或数据透视图时,该公式的结果可能会受到上下文的影响。 如果使用的是 Power Pivot 表,则上下文是当前行及其值。 如果使用的是数据透视表或数据透视图,则上下文表示由切片或筛选等操作定义的数据集或子集。 数据透视表或数据透视图的设计也施加了自己的上下文。 例如,如果创建按区域和年份对销售额进行分组的数据透视表,则只有应用于这些区域和年份的数据才会显示在数据透视表中。 因此,添加到数据透视表的任何度量值在列和行标题以及度量值公式中的任何筛选器的上下文中进行计算。
有关详细信息,请参阅 DAX 公式中的上下文。
删除筛选器
使用复杂公式时,你可能想要确切了解当前筛选器是什么,或者可能想要修改公式的筛选器部分。 DAX 提供了多个函数,可用于删除筛选器,并控制哪些列保留为当前筛选器上下文的一部分。 本部分概述了这些函数如何影响公式中的结果。
使用 ALL 函数重写所有筛选器
可以使用 ALL 函数替代以前应用的任何筛选器,并将表中的所有行返回到执行聚合或其他操作的函数。 如果使用一个或多个列而不是表作为 ALL的参数, ALL 函数将返回所有行,忽略任何上下文筛选器。
注意: 如果熟悉关系数据库术语,则可以将 ALL 视为生成所有表的自然左外部联接。
例如,假设你有表“销售额”和“产品”,并且想要创建一个公式,该公式将计算当前产品的销售额之和除以所有产品的销售额。 必须考虑到以下事实:如果在度量值中使用公式,数据透视表的用户可能会使用切片器来筛选特定产品,并在行上显示产品名称。 因此,若要获取分母的真实值,而不考虑任何筛选器或切片器,必须添加 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 函数。