上下文是DAX的基础,也是DAX中最复杂的主题,只有掌握这些知识点才敢说你已经搞懂了DAX,无论何时你遭遇到你想要却计算不出的表达式时,有很大原因是你还没有彻底掌握这些规则。
存在两种计算上下文:筛选上下文和行上下文,这两种计算上下文并不是同一概念的两种表述:筛选上下文用来筛选数据模型,行上下文仅在单张表内迭代。
为了理清一个公式的行为,你经常需要兼顾两种计算上下文因为他们在同一时刻执行。
对于计算列DAX会自动创建行上下文。同样也可以使用一个迭代器来创建行上下文。每个迭代器都会定义一个行上下文。
在用一张表中可以使用嵌套行上下文,最里面的行上下文覆盖同一张表中先前的行上下文。使用变量来储存那些需要行上下文去检索的值时是可行的。在早期版本的DAX中变量是不能使用的,需要使用EARLIER函数去传递给先前的行上下文。如今不鼓励使用EARILER函数。
当正在迭代的表是一个表表达式的结果时,行上下文仅包含表表达式返回的列。
当你在使用行、列、切片器、筛选器时会创建筛选上下文。一个筛选上下文同样能使用CALCULATE函数来创建。
行上下文并不会自动在关系间传递。如果需要强制去传递需要使用RELATED函数和RELATEDTABLE函数。你需要在一对多关系正确的行上下文中使用这些函数:RELATED用在关系的多端,RELATEDTABLE用在关系的一端。
筛选上下文筛选整个模型,它根据交叉筛选的方向使用关系。传递的一般是从一端传到多端。此外,如果你想使用双向交叉筛选的话,那么传递会从多端传到一端。
《The Definitive Guide to DAX》学习笔记
采悟 @ PowerBI星球
网友评论