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 函数 Elierer () 来存储当前操作之前的操作的行上下文。 该函数在内存中存储两组上下文——一组上下文表示公式内循环的当前行,另一组上下文表示公式外循环的当前行。 DAX 自动在两个循环之间提供值,以便您可以创建复杂的聚合。

有关示例,请参阅场景 - 对值进行排名和比较一章中的场景 - 创建动态排列值的 DAX 公式。

过滤上下文

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

过滤数据透视表创建的上下文

由数据透视表创建的过滤上下文是通过对以下数据透视表字段所做的选择应用的自然过滤 −

  • 行数
  • 过滤器
  • 切片器

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

过滤由 DAX 函数创建的上下文

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

过滤上下文作为行上下文的补充

行上下文不会自动创建过滤上下文。 您可以使用包含 DAX 过滤器函数的 DAX 公式实现相同的效果。