筛选公式中的数据

您可以在公式内创建筛选器,以便限制在计算中使用的源数据的值。为此,将一个表指定为对公式的输入,然后定义“筛选表达式”。您提供的筛选表达式将用于查询数据并且只返回源数据的子集。在每次您更新公式的结果时,将根据您的数据的当前上下文动态应用筛选器。本节描述如何在数据分析表达式 (DAX) 公式中创建筛选器。

对在公式中使用的表创建筛选器

您可以在采用表作为输入的公式中应用筛选器。您使用 FILTER 函数来定义指定表中行的子集,而非输入表名称。然后,该子集将传递到其他函数以便用于自定义聚合之类的操作。

例如,假定您具有一个表,表中的数据包含与分销商有关的订单信息,并且您想要计算每个分销商的销售额。但是,您想要只显示售出了多件较高价值产品的那些分销商的销售额。下面的公式基于 DAX 示例工作簿,说明如何通过使用筛选器创建此计算的一个示例:

=SUMX( 
     FILTER ('ResellerSales_USD', 'ResellerSales_USD'[Quantity] > 5 &&
     'ResellerSales_USD'[ProductStandardCost_USD] > 100), 
     'ResellerSales_USD'[SalesAmt]
     )
  • 公式的第一部分指定某一 PowerPivot 聚合函数,它使用表作为参数。SUMX 对表求和。

  • 公式的第二部分 FILTER(table, expression) 指示 SUMX 将使用的数据。SUMX 要求表或计算结果是表的表达式。在此处,您将使用 FILTER 函数指定表中所使用的行,而不是使用表中的所有数据。

    筛选表达式具有两个部分:第一部分命名要应用筛选器的表。第二部分定义要用作筛选条件的表达式。在这个例子中,您在筛选售出了 5 件并且产品成本超过 $100 的分销商。运算符 && 是逻辑 AND 运算符,这指示条件的两个部分必须都成立后,该行才会属于筛选出的子集。

  • 公式的第三部分向 SUMX 函数指出应对哪些值进行求和。在这个例子中,您仅使用销售额。

请注意,FILTER 之类返回表的函数永远不会将表或行直接返回到 PowerPivot 工作簿中,而是始终嵌入在其他函数中。有关 FILTER 和用于筛选的其他函数的详细信息以及更多的示例,请参阅筛选器函数 (DAX)

注意注意

筛选表达式受到在其中使用它的“上下文”的影响。例如,如果您在某一度量值中使用筛选器,并且该度量值用于数据透视表或数据透视图中,则返回数据的子集可能会受到用户已在数据透视表中应用的附加筛选器或切片器的影响。有关上下文的详细信息,请参阅 DAX 公式中的上下文

删除重复项的筛选器

除了筛选特定值之外,您还可以返回来自其他表或列的值的唯一集合。在您想要对列中唯一值的数目进行计数时,或者在将唯一值的列表用于其他操作时,上述功能特别有用。DAX 提供两个返回非重复值的函数:DISTINCT 函数 (DAX)VALUES 函数 (DAX)

  • 该 DISTINCT 函数检查您指定为函数参数的单个列,并且返回只包含非重复值的新列。

  • VALUES 函数也返回唯一值的列表,但还返回“未知成员”。在您使用的值来自某一关系联接的两个表,并且某个值在一个表中缺失、但在另一个表中存在时,该函数很有用。有关未知成员的详细信息,请参阅DAX 公式中的上下文

这两个函数都返回整个值列;因此,应该使用函数获取值的列表,然后将该列表传递到其他函数。例如,您可以通过唯一产品密钥使用以下公式获取特定分销商售出的不同产品的列表,然后通过使用 COUNTROWS 函数对该列表中的产品进行计数:

=COUNTROWS(DISTINCT('ResellerSales_USD'[ProductKey]))

上下文是如何影响筛选器的

在您将某一 DAX 公式添加到数据透视表或数据透视图时,该公式的结果可能会受到“上下文”的影响。如果您正在使用 PowerPivot 表,则上下文是当前行及其值。如果您正在使用数据透视表或数据透视图,则上下文意味着由切片或筛选之类的操作定义的数据集合或子集。数据透视表或数据透视图的设计还强加了其自己的上下文。例如,如果您创建按区域和年份对销售额进行分组的一个数据透视表,则只有应用于这些区域和年份的数据将出现在该数据透视表中。因此,您添加到数据透视表的任何度量值都在列和行标题的上下文中以及度量值公式的任何筛选器中计算。

有关详细信息,请参阅 DAX 公式中的上下文

删除筛选器

在使用复杂的公式时,您可能要准确了解当前筛选器是什么,并且可能要修改该公式的筛选器部分。DAX 提供若干函数,使您能够删除筛选器,以及控制哪些列作为当前筛选器上下文的一部分保留。本节概述这些函数是如何影响公式中的结果的。

使用 All 函数覆盖所有筛选器

您可以使用 ALL 函数覆盖以前已应用的任何筛选器,并且将表中的所有行返回到正在执行聚合或其他操作的函数中。如果您使用一列或多列(而非表)作为 ALL, 的参数,则 ALL 函数将返回所有行,并且忽略所有上下文筛选器。

注意注意

如果您对关系数据库术语很熟悉,则可以将 ALL 视作生成所有表的自然左外部联接。

例如,假定您具有一个 Sales 表和一个 Products 表,并且您想要创建一个公式,该公式将计算当前产品的销售额之和除以所有产品的销售额。您必须考虑到这样的事实:如果该公式用于度量值中,则数据透视表的用户可能正在使用切片器通过行上的产品名对特定产品进行筛选。因此,为了获取分母的实际值而不考虑任何筛选器或切片器,您必须添加 ALL 函数以便覆盖任何筛选器。下面的公式是一个示例,说明如何使用 ALL 来覆盖以前筛选器的效果:

=SUM (Sales[Amount])/SUMX(Sales[Amount], FILTER(Sales, ALL(Products)))
  • 公式的第一部分 SUM (Sales[Amount]) 计算分子。

  • 求和会考虑当前上下文,这意味着如果您将公式添加到计算列中,将应用行上下文;并且,如果您将公式作为度量值添加到数据透视表中,则会应用在数据透视表(筛选器上下文)中应用的任何筛选器。

  • 公式的第二部分将计算分母。ALL 函数将覆盖可能应用于 Products 表的任何筛选器。

有关详细信息以及详细示例,请参阅 ALL 函数 (DAX)

使用 ALLEXCEPT 函数覆盖特定的筛选器

ALLEXCEPT 函数也覆盖现有筛选器,但您可以指定应该保留某些现有筛选器。您指定为 ALLEXCEPT 函数的参数的列将指定继续筛选哪些列。如果您想要覆盖大多数列的筛选器,但不是覆盖所有列的筛选器,则 ALLEXCEPT 比 ALL 更方便。在您创建可能对许多不同的列进行筛选的数据透视表,并且想要控制在公式中使用的值时,该 ALLEXCEPT 函数特别有用。有关详细信息,包括如何在数据透视表中使用 ALLEXCEPT 的详细示例,请参阅 ALLEXCEPT 函数 (DAX)