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

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

行上下文

行上下文可以理解为当前行内容。行上下文的应用范围不只局限于当前一张表。如果两张表之间建立了关联关系,则通过该关联关系就形成一个跨表的行上下文。

筛选上下文

筛选上下文是指将原始数据按照一定规则进行筛选,然后将提取出来的结果再作为环境变量带入到函数中使用。通过设定筛选上下文,可以灵活的改变函数的运算范围,实现数据分类分析处理的目的。

需要记住的是,DAX 的行上下文和筛选上下文共同作用于函数运算当中并对其结果产生影响。在分析行上下文对函数结果的影响时要以当前行中的数据为研究基准,而分析筛选上下文对函数结果的影响时则要从筛选出的子表单入手进行。

当创建计算列时,DAX 会自动为其定义行上下文关系,即计算列中的每个值都受到其所在行数据的影响。而当使用度量值创建报表时,其运算都是基于表单中其他条件生成的筛选上下文而进行的。

以上介绍内容摘自(具体理论可以去看这一篇博客),我们主要实战

https://blog.csdn.net/jessica_seiya/article/details/90904341

常用函数 FILTER、ALL、CALCULATE 三者与上下文关系

用一个例子,公路自行车占各省的销售金额以及占各省销售的占比

FILTER:带入一个新的行上下文,不会影响原有的上下文,可以被切片

ALL:完全用自身所有数据,其他行 / 筛选上下文不起作用

CALCULATE:针对公式里面列会强行替换原有上下文,其他不受影响

下面验证一下上面三个函数对上下文影响:

数据集(销售记录)

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图1

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图2

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图3

度量值如下:

销售额:=SUM([金额])

公路自行车销售额:=SUMX(FILTER(‘销售记录’,’销售记录’[产品名称]=”公路自行车”),’销售记录’[金额])

金额占比:=DIVIDE([公路自行车销售额],[销售额])

用 ALL 计算的销售额:=SUMX(ALL(‘销售记录’),’销售记录’[金额])

CAL 计算公路自行车销售额:=CALCULATE([销售额],’销售记录’[产品名称]=”公路自行车”)

CAL/ALL 计算公路自行车销售额:=CALCULATE([用 ALL 计算的销售额],’销售记录’[产品名称]=”公路自行车”)

生成数据透视表

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图4

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图5

添加切片器(画红色的发生变化了)

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图6

CALCULATE 函数计算与 FILTER/SUMX 没什么差别,但是在筛选为产品名称就有差别了

CAL 计算公路自行车销售额:=CALCULATE([销售额],’销售记录’[产品名称]=”公路自行车”)

CALCULATE 里面的行上下文替换了原有的筛选上下文,所以每一行都会有记录,而 FILTER 带入一个新的行上下文,不会影响原有的上下文,可以被切片

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图7

使用 Calculate 进行上下文转换

我们想统计产品分类 —— 销售额占百分比

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图8

传统做法

生成数据透视表 — 值显示方式 —-

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图9

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图10

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图11

使用 DAX 函数怎么生成呢?

度量值

销售额:=SUM([金额])

总的销售额 ALL:=SUMX(ALL(‘销售记录’),’销售记录’[金额])

ALL 百分比:=DIVIDE([销售额],[总的销售额 ALL])

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图12

但是我们按照年份筛选就会有存在问题

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图13

所以我们可以改进一下

总的销售额 CAL:=CALCULATE([销售额],ALL(‘产品分类’))

CAL 百分比:=DIVIDE([销售额],[总的销售额 CAL])

(2条消息) Power BI(二十一)power pivot之筛选上下文和行上下文_可乐联盟-CSDN博客_筛选上下文和行上下文 - 图14
https://blog.csdn.net/LuYi_WeiLin/article/details/99216271