PowerBI之DAX神功:答网友问03.VAR变量与惰性计算
在学习《DAX神功》第2卷第1回时,有小伙伴误操作写错一个新建列,但是发现了一个问题:
毛利额=
VAR x='Sheet1'[销量]*'Sheet1'[售价]
VAR y='Sheet1'[销量]*'Sheet1'[进价]
return
CALCULATE(sumx('Sheet1',x-y),all(Sheet1))

为什么会发生这样的事情,这个事情不能直接讲!需要推理!

我们从最熟悉的地方开始操作:
【度量值】总毛利 = sumx('Sheet1','Sheet1'[销量]*'Sheet1'[售价]-'Sheet1'[销量]*'Sheet1'[进价])
【新建列】毛利额 = CALCULATE([总毛利],all(Sheet1))

【总毛利】这个度量值,本身具有筛选功能,如果直接放到新建列上,就可以筛选

但是,当我写成all(表)形式以后,sheet1表所有列都不能筛选了,所以我们得到的是 21+24+27=72这个固定值

我们在《DAX神功》第2卷第1回讲的惰性计算,以下为我课上的原文,并且在那节课我们举了案例,想必很多小伙伴忽略了这个问题
名词解释:
惰性计算(Lazy Evaluation),又称懒惰计算、懒汉计算,是一个计算机编程中的一个概念,它的目的是要最小化计算机要做的工作。
VAR就是惰性计算:
<1> 没有被使用过的变量永远不会被计算
<2> 当变量完成了首次计算,则它不会在同一范围内被再次计算。
回到我们的问题上来,由于我们使用了变量,VAR就是惰性计算
毛利额 =
VAR x='Sheet1'[销量]*'Sheet1'[售价]
VAR y='Sheet1'[销量]*'Sheet1'[进价]
return
CALCULATE(sumx('Sheet1',x-y),all(Sheet1))
变量x和y当我们没有使用它们时,它们不会被计算,就在那摆着,就是玩
在新建列中,我们的 变量=表[列] 时代表当前行(是一个标量值)
但是,当他们参与计算时,只完成首次计算,就是x-y (这就是惰性计算)
因为你在新建列里面操作,那么它就变成了:
由于每一行里面都有一个迭代函数sumx,它的作用就是每一行求和,且all(sheet1)就限制了这个表所有列都不能筛选。
第一行:
毛利额= Calculate(sumx('Sheet1',21),all(Sheet1))
因为Sheet1这张表有3行,所以21*3=63
第二行:
毛利额= Calculate(sumx('Sheet1',24),all(Sheet1))
因为Sheet1这张表有3行,所以24*3=72
第三行:
毛利额= Calculate(sumx('Sheet1',27),all(Sheet1))
因为Sheet1这张表有3行,所以27*3=81
最终结果:

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110