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公式的值将出现在计算列中.

相比之下,当你有一个DAX函数(如SUMX)时,逐行计算的值得到总结而且只有最终值结果将显示.也就是说,中间值被丢弃.

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

多行上下文

DAX具有像SUMX这样的迭代器函数.您可以使用这些函数来嵌套行上下文.通过这种方式,您可以通过内部循环和外部循环进行递归,在此循环中可以有多个当前行和当前行上下文.

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

有关示例,请参阅方案 - 在方案一章中创建动态排名值的DAX公式 - 排名和比较值.

过滤上下文

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

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

由数据透视表创建的过滤器上下文是自动过滤,由以下和下面的数据透视表字段中的选择应用;

  • 过滤器

  • 切片器

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

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

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

过滤上下文作为行上下文的添加

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