变量的计算环境

今天有个小朋友问了我一个变量问题,看样子是纠结了好久了,如果我不给他解套,估计得悬梁自尽了,为了帮助朋友,我可是两肋插刀的人,
file
二个同样的变量为什么表现不一样,这个问题其实难倒了好多初学者,其中包过我自己,
为了说明这个问题我们在dax studio中模拟其效果
数据源:
file
定义二个表
file
从定义的表看,第一个表达式,定义了一个变量,然后添加到计算列,
结果是一样的,这是符合预期的,因为变量在它定义的环境中计算,
file
这个变量的环境是什么?首先我们看看calculate的外部环境没有的,强制定义的环境是ALLEXCEPT('表1 1','表1 1'[产品]),
就是保留产品的筛选,确切讲它是在改变外部环境,然而外部环境没有,你改变啥,所以这个定义的环境无法被激活,最后相当于在原表上筛选一个最大的时间,当然就是2020/3/4日,好了第一个表达是的变量就分析完了,然后把这个变量添加到计算列里等于填充了一个常量,因为添加到计算列之前已经计算完毕了.
让我们再看看第二个表达式
file
在计算列列定义了一个变量,这个变量的计算环境是什么?
每行的所有列(扩充表的所有列-事实表),这是外部环境,内部来一个强制定义的环境,忽略了所有列筛选,只取产品这个筛选器,所以最后的计算环境就是产品了,产品相同的日期相同,日期随着产品的变化而变化,
file
让我再写过 度量值

总数量:=var  a = CALCULATE(MAX('表1 1'[日期]),ALLEXCEPT('表1 1','表1 1'[产品]))
return CALCULATE(SUM('表1 1'[数量]),'表1 1'[日期]=a)

结果是:
file
结果是:4
这个4怎么来的,
这个变量的计算环境是什么,变量 a = CALCULATE(MAX('表1 1'[日期]),ALLEXCEPT('表1 1','表1 1'[产品]))它的外部环境没有,内部虽然有个强制定义的环境,但是没有激活,所以日期是2020/3/4日,这整个事实表的最大日期的数量,
因为这是个度量值,让我们将其放入透视表
file
结果是各不相同的,因为变量 a = CALCULATE(MAX('表1 1'[日期]),ALLEXCEPT('表1 1','表1 1'[产品]))的外部环境发生了变化,它受到透视表的行标签的筛选,产品筛选了表1 1,所以表格只有部分可见,比如 A产品的子集是
file
然后在子集的表中去掉所有的筛选器,除产品外.所以MAX('表1 1'[日期])计算的子集是
file
结果不言而喻2020/3/2日
CALCULATE(SUM('表1 1'[数量]),'表1 1'[日期]=a)=>CALCULATE(SUM('表1 1'[数量]),'表1 1'[日期]=date(2020,3,2))
那么它的计算环境是什么呢?外部行标签产品,内部日期二个筛选器的交集,产品的最大日期的数量总和
结果是 2
透视表B产品推导是一样的
file

这些看似非常深奥,其实看完数圣经一切变得非常简单了
https://shimo.im/docs/axk6MwGPnLSpFeqr/read
更多详情请点开链接,二个意大利人改变了世界