PowerBI之DAX神功:第1卷第12回 理解上下文
《孙兴华讲PowerBI火力全开》笔记06.被翻译耽误的上下文
我使用最精简的语言阐述了上下文:
1.新建列是行上下文,行上下文没有筛选功能
2.想让行上下文实现筛选功能就要在外面套一个Calculate
3.度量值是筛选上下文,度量值天生具有筛选功能
记住这3句话,你就知道什么是上下文了。
公式:平时总分=Sum('Sheet1'[平时成绩]) 我们分别放在新建列和度量值中
【1】将公式用在新建列上时,因为新建列是行上下文,没有筛选功能,返回的结果就是平时成绩那一列的总和值60

【2】给新建列套上一个Calculate就实现了行上下文转筛选上下文
【新建列】平时总分=Calculate(sum('Sheet1'[平时成绩]))

很多人在这个时候,「走火入魔」,他们认为Calculate有两个参数,第1参数是计算器,第2参数是筛选器,怎么不写第2参数也可以呢?
答:一定要养成自学的能力,以前你上学时,学的知识是如何将那张考卷考出圆满的成绩,等你工作以后,纸上谈兵的事情会越来越少。遇到这样的问题,直接看帮助文档就解决了。

Calculate第二参数是可选参数,Calculate(sum('Sheet1'[平时成绩])) 我们只是让sum('Sheet1'[平时成绩])具备筛选功能,没有必要去设置筛选条件
这时Calculate的作用就是将行上下文件转换成筛选上下文件
【3】用在度量值上,度量值天生具有筛选功能
【度量值】平时总分=Sum('Sheet1'[平时成绩])
如果将度量值放到矩阵里,那肯定有筛选功能:

将度量值放到新建列中,同样可以实现筛选,因为度量值天生具有筛选功能
【新建列】新建列 = [平时总分]

【4】解决问题,有网友问过我,为什么?
【新建列】总分 = 'Sheet1'[平时成绩] + 'Sheet1'[考试成绩] // 正确
【度量值】总分 = 'Sheet1'[平时成绩] + 'Sheet1'[考试成绩] // 错误
电视剧《铁齿铜牙纪晓岚》中有一集,那时候纪晓岚是侍郎(官职) 和珅是尚书(官职)和珅就看到一只狗问纪晓岚 :是狼(侍郎)是狗? 纪晓岚回答:看尾巴,尾巴下垂的是狼,尾巴上竖(尚书)是狗。

【新建列】总分 = 'Sheet1'[平时成绩] + 'Sheet1'[考试成绩]
新建列是行上下文,逐行扫描,例如:
10+1=11
20+2=22
30+3=33
都是逐行计算, 新建列自动创建行上下文

而度量值是一个筛选上下文:

所以我们的公式应该这样写
[度量值] 总分 = sum(Sheet1[平时成绩])+sum(Sheet1[考试成绩])
解读:就是两个具有筛选功能的度量值相加;两杯自来水倒在一个杯子里还是自来水。
将度量值放到矩阵中:

将度量值放到新建列上:
【新建列】 新建列 = [总分]

现在我们观察一下刚才写的度量值
[度量值] 总分 = sum(Sheet1[平时成绩])+sum(Sheet1[考试成绩])
还有另外一种方法可以写:这是《The Definitive Guide to DAX》上介绍的方法
[度量值] 总分 = sumx('Sheet1','Sheet1'[平时成绩]+'Sheet1'[考试成绩])
sumx是迭代函数,它是在创建行上下文(让两个列的每一行相加),如果将它放到了度量值中,就被转换成筛选上下文了
为什么不能写成
【度量值】总分 = 'Sheet1'[平时成绩] + 'Sheet1'[考试成绩]
因为度量值是筛选上下文,它可以将行上下文转化为筛选上下文,但是它不能创建行上下文
'Sheet1'[平时成绩] + 'Sheet1'[考试成绩]
两个列相加这是在创建行上下文的过程
sumx是迭代函数,我们需要先用迭代函数创建行上下文之后,放到度量值中做转换
《The Definitive Guide to DAX》指出:如果需要在度量值中使用行上下文,则请使用迭代函数。
实际上,方法并不唯一,今天我就给你们展示了另外一种方法。
我最不喜欢听到的一句话:“学英语的重要性,是我们可以看国外的更多文献和书籍”,就算你看外国人写的地理和历史书籍,都需要用脑子,书和文字是固定的,脑子是活的。
