浅谈DAX中的上下文概念

在学习DAX语言中,几乎无时无刻都会碰到上下文(Context)这一概念概念,很多函数的解释说明中都会特别强调它会受到何种类型上下文影响,是否当前上下文关系对其起作用,以及该函数是否能改变另一个被当做参数函数的上下文等。可以说,如果不知道DAX中的上下文是什么,基本就无法掌握DAX语言。

其实上下文概念并不深奥,但是对于习惯使用Excel计算函数的亲们来说在学习这块知识时感觉会比较别扭,这主要是因为在Excel中,某一段计算内容的确定是通过Excel表格中的座标来确定的,非常直观,例如SUM(A1:A3),能让人一眼就明白要计算的内容是A1单元格到A3单元格之间所有数字的总和。而在DAX中,为了支持对大数据进行多样化的运算,它没有使用Excel中通过固定座标定义函数运算范围的方式,转而通过上下文概念来定义函数所在的环境变量,即其运算范围,实现了函数对数据的处理可以根据上下文的不同而输出不同的运算结果。因此,只有充分理解了上下文含义才能更好的使用DAX来分析数据。

DAX中有两种类型的上下文分:行上下文(Row Context)和筛选上下文(Filter Context)。

行上下文

行上下文可以理解为当前行内容。例如下图中要求每个产品的利润,可以创建一个计算列Profit利用下面公式获得。

在这里插入图片描述

Profit =
'Product'[Price] - 'Product'[Cost]

Profit计算列中的每个值,都是由其所在行的Price值减去Cost值获得的。这其中,每一行内的Price值和Cost值就是确定当前行Profit值的上下文。

行上下文的应用范围不只局限于当前一张表。如果两张表之间建立了关联关系,则通过该关联关系就形成一个跨表的行上下文。例如下面的Product表和SalesInfo表通过Product列建立了一个一对多的关联关系。当在SalesInfo表中要获取每种商品的销售额时,就可以利用表单之间的关联关系,通过行上下文的概念在找到Product表中找到每种商品对应的价格来进行计算。
在这里插入图片描述

筛选上下文

筛选上下文是指将原始数据按照一定规则进行筛选,然后将提取出来的结果再作为环境变量带入到函数中使用。通过设定筛选上下文,可以灵活的改变函数的运算范围,实现数据分类分析处理的目的。例如对上面表单的数据,可以将Total_Sales改写为下面形式来只计算Country是Australia的销售额。

Total_Sales =
SUMX (
    FILTER ( SalesInfo, SalesInfo[Country] = "Australia" ),
    SalesInfo[Product_Sales]
)

在这里插入图片描述
计算Australia销售总额的Total_Sales计算列中调用了一个FILTER函数,目的是生成一个只包含Country是Australia相关数据的子表单。SalesInfo[Country] = "Australia"即是筛选上下文条件,将函数SUMX的计算范围从原始数据中的所有Country变成只针对Australia进行计算。

筛选上下文在矩阵表中的应用最为明显。例如创建一个度量值TotalSales_Measure来计算销售总和,之后在报表页面创建一个矩阵表,选择使用Country做行,Product做列,TotalSales_Measure做值,再将矩阵表展开就可以得到下面的数据结果。
在这里插入图片描述
矩阵表中清晰的显示了每个国家的产品销售总额,以及每种产品在每个国家内的销售额。之所以能得到这样的结果是因为矩阵表中的行Country和列Product是筛选上下文的条件,能限制度量值TotalSales_Measure中SUM函数的运算范围。例如,当矩阵表中行值是Australia,列值是Pillows时就会形成一个Country=Australia,Product=Pillows的筛选条件,原始数据会被该筛选条件进行过滤,所有符合条件的数据会组成一个子表单,之后SUM函数会在该子表单上来计算销售额。

需要记住的是,DAX的行上下文和筛选上下文共同作用于函数运算当中并对其结果产生影响。在分析行上下文对函数结果的影响时要以当前行中的数据为研究基准,而分析筛选上下文对函数结果的影响时则要从筛选出的子表单入手进行。
当创建计算列时,DAX会自动为其定义行上下文关系,即计算列中的每个值都受到其所在行数据的影响。而当使用度量值创建报表时,其运算都是基于表单中其他条件生成的筛选上下文而进行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章