在 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 函数指出应对哪些值进行求和。在本例中,您仅使用销售额。

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

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

删除重复项的筛选器

除了筛选特定值之外,您还可以返回来自其他表或列的一组唯一的值。在您想要对列中唯一值的数目进行计数时,或者在将唯一值的列表用于其他操作时,这特别有用。DAX 提供两个返回不同的值的函数:DISTINCT 函数VALUES 函数

  • 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)))

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

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

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

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

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

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

返回页首

注意: 机器翻译免责声明:本文是由无人工介入的计算机系统翻译的。Microsoft 提供机器翻译是为了帮助非英语国家/地区用户方便阅读有关 Microsoft 产品、服务和技术的内容。由于机器翻译的原因,本文可能包含词汇、语法或文法方面的错误。

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

此信息是否有帮助?

谢谢您的反馈!

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

×