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