calculate-见解

数据源:
file
第一个度量值:

数量 的总和:=SUM([数量])

表2添加一个计算列:

 =  CALCULATE([数量 的总和],FILTER('表3','表3'[供应商]=1  ))

file
因为表3和表2没有筛选器冲突,所以calculate接受了外部行上下文筛选,和calculate内部第二参数的筛选,供应商1全部显示.
让我修改一下计算列表达式:

=CALCULATE(
                                CALCULATE([数量 的总和],FILTER('表3','表3'[供应商]=1  ))
                          )  

上面这个计算列表达式:在第一个表达式前加个calculate,看看效果
file
结果没有变化,只是计算原理有点变化,第一个calculate将外部行转换为筛选上下文,传递给第二个calculate,第二个calculate目前有二个筛选器,一个是第一个calculate传递过来的,也是唯一的一个原始上下文并且享有优先计算权,,第二个筛选器是内部的filter表达式,第二个calculate内部表达式先计算第二个参数,然后计算第一参数,计算第二个筛选器,外部环境是第一个calculate传递过来的原始上下文,计算filter内部的表,然后再计算filter 的第二参数,filter的第二参数计算完毕,它是第一参数的新的计值上下文,最后计算第一个参数.
让我写第三个计算列表达式:

=CALCULATE(
                                CALCULATE([数量 的总和],FILTER('表3','表3'[供应商]=1  )),
              ALL('表2'[产品])              )   

第一个calculate添加一个参数all(表2[产品]),忽略外部行上下文,看看第二个calculate会是如何工作呢?
file
从结果看,对供应商1求和了,外部行上下文没有发生转换,外部行没有参与筛选,因为第一个calculate已经忽略了外部行上下文,尽管内部第一参数有calculate,也无法接受外部行上下文,大概就是函数的作用域吧,所以calculate的第一参数不会直接和外部行上下文发生关系,但是可以接受calculate的接受的筛选器,总结,内部calculate受外部calculate的屏蔽隔离,不会穿越它外部的calculate直接和外部行上下文发生关系,
file

更多的文章请关注:
https://pbihub.cn/blog/1079
https://pbihub.cn/blog/1063