在 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函数指定使用哪个表中的行。

    Filter 表达式具有两个部分: 的第一部分名称筛选器应用的表。第二部分定义要用作筛选条件表达式。在此例中,您正在筛选经销商销售五个以上的单位和成本超过为 ¥ 100 的产品。运算符,& &、 是逻辑的和运算符,指示该条件的两个部分必须为真要筛选的子集所属的行。

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

    请注意,筛选器,如函数返回一个表,其中永远不会返回的表或行直接,但通常被嵌入另一个函数中。筛选器和其他函数,用于筛选,包括更多示例,有关详细信息,请参阅筛选器函数 (DAX)

    注意: 筛选器表达式受使用它的上下文。例如,如果您使用筛选器中度量值,并且度量值用于数据透视表或数据透视图中,将返回的数据的子集可能受其他筛选器或用户已应用的数据透视表中的切片器。有关上下文的详细信息,请参阅DAX 公式中的上下文

删除重复项的筛选器

除了筛选特定值,您可以从另一个表或列返回一组独有的值。如果要将计算列中的唯一值的个数,或使用的唯一值列表的其他操作,则可以很有帮助。DAX 提供两个函数用于返回不同的值: DISTINCT 函数值函数

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

  • VALUES 函数也会返回列表中的唯一值,但也会返回未知的成员。当使用之间的关系,联接的两个表中的值时,这是非常有用,值为一个表中缺少和其他中存在。有关未知成员的详细信息,请参阅DAX 公式中的上下文

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

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

返回页首

上下文是如何影响筛选器

将 DAX 公式添加到数据透视表或数据透视图时,该公式的结果可能受到上下文。如果您正在Power Pivot表中,上下文是当前行和其值。如果您使用的数据透视表或数据透视图,上下文意味着集或定义的操作,如切片,或筛选的数据的子集。数据透视表或数据透视图的设计,同时也施加了自己的上下文。例如,如果您创建按区域和年的销售额进行分组的数据透视表,仅适用于这些区域和年的数据显示在数据透视表中。因此您将添加到数据透视表中任何度量值被计算列和行标题和度量值的公式中的所有筛选器的上下文中。

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

返回页首

删除筛选器

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

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

您可以使用ALL函数覆盖以前应用的所有筛选器,并执行聚合或其他操作的函数返回表中的所有行。如果您使用一个或多个列,而不是一个表,作为参数ALLALL函数将返回所有行,忽略所有上下文筛选器。

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

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

= SUM (Sales [Amount]) / SUMX (Sales [Amount] 筛选器 (销售额,ALL(Products)))

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

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

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

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

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

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

返回页首

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

此信息是否有帮助?

谢谢您的反馈!

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

×