欢迎光临散文网 会员登陆 & 注册

PowerBI之DAX神功:第1卷第12回 理解上下文

2021-08-14 12:02 作者:孙兴华zz  | 我要投稿

《孙兴华讲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》指出:如果需要在度量值中使用行上下文,则请使用迭代函数。

实际上,方法并不唯一,今天我就给你们展示了另外一种方法。

我最不喜欢听到的一句话:“学英语的重要性,是我们可以看国外的更多文献和书籍”,就算你看外国人写的地理和历史书籍,都需要用脑子,书和文字是固定的,脑子是活的。


《PowerBI之DAX神功》视频版,同步更新中。。。。

https://www.bilibili.com/video/BV1YE411E7p3

PowerBI之DAX神功:第1卷第12回 理解上下文的评论 (共 条)

分享到微博请遵守国家法律