Excel DAX - 计算上下文



在DAX中,上下文是一个重要的术语,在编写DAX公式时应注意。也称为计算上下文,DAX上下文用于确定DAX公式的计算和相应的结果。这意味着DAX公式的结果会根据上下文而有所不同。您应该清楚地了解如何使用特定的DAX上下文以及结果如何不同。

计算上下文使您可以执行动态分析,其中DAX公式的结果可以更改以反映当前行或单元格选择以及任何相关数据。理解上下文并有效地使用上下文对于构建强大的DAX公式、执行动态数据分析和排除DAX公式中的问题非常重要。计算上下文是DAX所有高级功能的基础,您需要掌握这些功能才能创建复杂的数据分析报告。

当您不断参考DAX函数在DAX公式中的相关用法时,您需要参考本章关于DAX上下文的章节以获得结果的清晰度。

DAX中的上下文类型

DAX支持以下计算上下文:

  • 行上下文
  • 筛选上下文

当计算DAX公式时,所有上下文都将被考虑在内并被相应地应用。上下文同时存在,公式的结果将根据计算值时使用的上下文而不同。例如,当您在数据透视表中选择行、列和筛选器字段时,小计将根据小计/总计关联的行和列以及行和列中的值动态计算,行和列中的值由使用的筛选器确定。

行上下文

行上下文意味着DAX公式或DAX函数知道它在任何时间点都引用的是表的哪一行。您可以将行上下文视为当前行。公式将逐行计算,并带有行上下文。

一些DAX函数(例如,X函数、FILTER())和所有计算列都具有行上下文。例如,如果您使用DAX公式=YEAR([Date])创建一个名为Year的计算列,则计算列的值是通过逐行将给定的DAX公式应用于表中的给定列获得的。

这意味着,如果您创建了一个计算列,则行上下文包含每一行中的值以及与当前行相关的列中的值,这由所使用的DAX公式确定。虽然DAX公式不包含对行的引用,但DAX在计算值时会隐式地理解行上下文。

当您定义计算列时,DAX会自动创建行上下文,并且使用DAX公式的所有计算值都将出现在计算列中。

相反,当您使用SUMX之类的DAX函数时,逐行计算的值会被累加,并且只会显示最终结果。也就是说,中间值将被丢弃。

当您拥有相关表时,行上下文将确定相关表中哪些行与当前行关联。但是,行上下文不会自动通过关系传播。为此,您必须使用DAX函数 - RELATED和RELATEDTABLE。

多行上下文

DAX具有SUMX之类的迭代器函数。您可以使用这些函数嵌套行上下文。通过这种方式,您可以通过编程方式对内循环和外循环进行递归,您可以在其中有多个当前行和当前行上下文。

例如,您可以使用DAX函数Earlier(),它存储来自在当前操作之前执行的操作的行上下文。此函数在内存中存储两组上下文——一组上下文表示公式内循环的当前行,另一组上下文表示公式外循环的当前行。DAX会自动在两个循环之间传递值,以便您可以创建复杂的聚合。

例如,请参考“场景 - 排名和比较值”章节中的场景 - 创建动态排名值的DAX公式。

筛选上下文

筛选上下文是指应用于DAX中数据模型的任何筛选。筛选上下文由数据透视表和DAX函数创建。

数据透视表创建的筛选上下文

数据透视表创建的筛选上下文是对从以下内容中对数据透视表字段所做的选择应用的自然筛选:

  • 筛选器
  • 切片器

数据透视表创建的筛选上下文会筛选数据模型中的基础表。如果表是相关的,则筛选器会从查找表向下传递到数据表。这意味着您可以根据查找表的结果筛选数据表。筛选器传播不会反过来进行。但是,您可以使用DAX公式根据数据表的结果筛选查找表。

DAX函数创建的筛选上下文

您可以使用DAX筛选函数定义计算字段和计算列,这些字段和列包含控制DAX公式使用的值的筛选表达式。然后,这些计算字段和计算列成为数据透视表字段列表的一部分,您可以将其添加到数据透视表。您还可以使用这些DAX筛选函数有选择地清除特定列上的筛选器。一个强大的DAX筛选函数来创建筛选上下文的例子是CALCULATE()。例如,请参考“场景 - 执行复杂计算”章节。

筛选上下文作为行上下文的补充

行上下文不会自动创建筛选上下文。您可以使用包含DAX筛选函数的DAX公式来实现相同的结果。

广告