Excel DAX - 执行复杂计算
DAX 公式可以执行涉及自定义聚合、过滤和条件值使用的复杂计算。 您可以使用 DAX 执行以下操作 −
- 为数据透视表创建自定义计算。
- 对 DAX 公式应用过滤器。
- 有选择地删除过滤器以创建动态比率。
- 使用来自外循环的值。
为数据透视表创建自定义计算
DAX 函数 CALCULATE 和 CALCULATETABLE 功能强大且灵活。 它们对于定义计算字段很有用。 这些 DAX 函数使您能够更改执行计算的上下文。 您还可以自定义要执行的聚合类型或数学运算。
CALCULATE 函数
CALCULATE (<expression>, [<filter1>], [<filter2>]…)
CALCULATE 函数计算由零个或多个指定过滤器修改的上下文中的给定表达式。
如果您的数据已被过滤,则 CALCULATE 函数会更改过滤数据的上下文,并在您通过过滤器指定的新上下文中计算表达式。 这意味着,指定列上的任何现有过滤器都将被删除,并应用 filter 参数中使用的过滤器。
示例
假设您想要显示按国家/地区名称过滤的奖牌百分比。 您的计算应获得覆盖您在数据透视表中对国家/地区应用的过滤器的百分比值。
定义一个计算字段——奖牌计数的百分比,如下面的屏幕截图所示。

使用此 DAX 公式,结果表中的所有行都在 CALCULATE 函数中被考虑在内,过滤器包含 ALL 函数。 这样,您就得到了分母中的总数。
您的数据透视表将如以下屏幕截图所示。

在上面的屏幕截图中,国家/地区被过滤为美国,数据透视表中显示了前 18 个值。 接下来,您可以动态过滤数据透视表中的值。 但是,根据您使用的自定义 DAX 公式,计算将是正确的。
CALCULATETABLE 函数采用值表并执行与 CALCULATE 函数相同的操作。
过滤公式中的数据
您可以在 DAX 公式中创建过滤器,以从源数据中选择值用于计算。 您可以通过定义过滤器表达式并将其与作为 DAX 公式输入的表一起使用来实现此目的。
过滤器表达式使您能够获取源数据的子集。 每次更新 DAX 公式的结果时都会动态应用过滤器,具体取决于数据的当前上下文,您可以放心获得准确且符合预期的结果。
过滤器表达式通常包含一个 DAX 过滤器函数,该函数仅返回表的选定行,然后可以将其用作您用于数据聚合的另一个 DAX 函数的参数。
示例
以下屏幕截图显示了计算字段的定义,该字段仅为夏季运动提供奖牌数。

有了这个计算字段,数据透视表看起来如以下屏幕截图所示。

如您所见,右侧数据透视表中包含新计算字段的值与左侧数据透视表中的值相匹配,并且显式应用了季节字段过滤器。
注意 − DAX 过滤器和值函数返回一个表,但从不将表或行直接返回到数据模型,因此总是嵌入到另一个 DAX 函数中。
有关这些 DAX 函数的详细信息,请参阅"DAX 过滤器函数"一章。
动态添加和删除过滤器
您在数据透视表中使用的 DAX 公式可能会受到数据透视表上下文的影响。 但是,您可以通过添加或删除过滤器来选择性地更改上下文。 您可以使用 DAX 函数 ALL 和 ALLEXCEPT 来动态选择行,而不管数据透视表上下文如何。
此外,您可以使用 DAX 函数 DISTINCT 和 VALUES 来返回不同的值。
使用外循环的值
在使用 DAX EARLIER 函数创建一组相关计算时,您可以使用先前循环中的值。 此 DAX 函数最多支持两层嵌套循环。