在 DAX 公式中筛选数据

注意: 我们希望能够尽快以你的语言为你提供最新的帮助内容。本页面是自动翻译的,可能包含语法错误或不准确之处。我们的目的是使此内容能对你有所帮助。可以在本页面底部告诉我们此信息是否对你有帮助吗?请在此处查看本文的英文版本以便参考。

本部分介绍了如何在数据分析表达式 (DAX) 公式中创建筛选器。您可以在公式内创建筛选器, 以限制用于计算的源数据中的值。若要执行此操作, 请将表指定为公式的输入, 然后定义筛选表达式。你提供的筛选表达式用于查询数据, 并仅返回源数据的子集。每次更新公式的结果时, 都会动态应用筛选器, 具体取决于数据的当前上下文。

本文内容

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

删除重复项的筛选器

上下文是如何影响筛选器

删除筛选器

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

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

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

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

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

= SUMX (
     筛选器 ("ResellerSales_USD"、"ResellerSales_USD" [数量] > 5
&&      "ResellerSales_USD" [ProductStandardCost_USD] > 100),
     "ResellerSales_USD" [SalesAmt]
     )

  • 公式的第一部分指定一个Power Pivot聚合函数, 该函数将表用作参数。SUMX 计算表的总和。

  • 公式的第二部分FILTER(table, expression),告诉SUMX要使用的数据。SUMX需要表或生成表格的表达式。在这里, 你可以使用FILTER函数来指定使用表中的哪些行, 而不是使用表中的所有数据。

    筛选表达式有两部分: 第一部分命名要应用筛选器的表。第二个部分定义一个用作筛选条件的表达式。在这种情况下, 你将在售出超过5个单元以及价格超过 $100 的产品的经销商处进行筛选。运算符 && 是一个逻辑 AND 运算符, 这表示条件中的两个部分都必须为 true, 才能使该行属于筛选的子集。

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

    请注意, 筛选器 (该函数返回表) 不会直接返回表或行, 而是始终嵌入在另一个函数中。有关筛选器和用于筛选的其他函数的详细信息, 包括更多示例, 请参阅筛选器函数 (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 表和一个 Products 表,并且您想要创建一个公式,该公式将计算当前产品的销售额之和除以所有产品的销售额。您必须考虑到这样的事实:如果该公式用于度量值中,则数据透视表的用户可能正在使用切片器通过行上的产品名对特定产品进行筛选。因此,为了获取分母的实际值而不考虑任何筛选器或切片器,您必须添加 ALL 函数以便覆盖任何筛选器。下面的公式是一个示例,说明如何使用 ALL 来覆盖以前筛选器的效果:

= SUM (销售额 [金额])/SUMX (sales [金额], 筛选器 (销售额, 全部 (产品)))

  • 公式的第一部分, SUM (Sales[Amount]) 将计算分子。

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

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

有关详细信息, 包括详细的示例, 请参阅ALL 函数

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

ALLEXCEPT 函数也会替代现有筛选器, 但你可以指定应保留某些现有筛选器。将您命名为 ALLEXCEPT 函数的参数的列指定将继续筛选哪些列。如果你想要从大多数列 (而非全部) 覆盖筛选器, 则 ALLEXCEPT 比 all 更方便。当你创建可能在许多不同的列上进行筛选的数据透视表, 并且你希望控制公式中所用的值时, ALLEXCEPT 函数尤其有用。有关详细信息, 包括如何在数据透视表中使用 ALLEXCEPT 的详细示例, 请参阅ALLEXCEPT 函数

返回页首

扩展你的 Office 技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×