热线电话:13121318867

登录
2020-05-13 阅读量: 1345
DAX函数:关于能否将聚合函数直接嵌套进其他函数内部使用的问题

首先看两个新建度量值的公式:

度量值1=rankx(all('公司信息'[城市]),[1.金额合计])

度量值=rankx(all('公司信息'[城市]),sum('商机记录'[商机金额(M)])

其中[1.金额合计]的公式就是sum('商机记录'[商机金额(M)]的公式

然而,两个度量值在拖入表格后的结果不同

前者是1,2,3,4,5

后者是1,1,1,1,1

这因为在PowerBI的底层运算逻辑中存在“行上下文”和“筛选上下文”的区别,要完全弄懂两者的区别很浪费时间,可以简单理解为行上下文是双层循环,筛选上下文是单层循环,而计算排名如果使用筛选上下文会导致错误。

个人的浅显理解如下(可能很片面,希望读者能够补充):

筛选上下文,因为是单层循环,只会遍历一次城市名列表,所以在算完一个城市的金额以后会直接排序,此时其他城市没有计算结果,所以排名是1,在遍历下一个城市的时候,前面的计算值会刷新,第二个城市有金额,然后直接排序,其他的还是没金额,仍然是第1,以此类推。

行上下文是两层循环,外层第一个城市北京,内层sum全部遍历,返回了所有城市的金额,然后对外层的第一个城市排序,这时候名次正确,然后外层循环到第二个城市,这时候内层sum又全部计算一次,第二个城市又生成排名,然后是外层第三个城市,这时候内层sum再次全部遍历,生成第三个城市正确排名,以此类推。

如果仅仅是数据分析,我们需要做到的是避免犯这种错误,所以“不要把聚合函数直接嵌套进其他函数内部使用,需要先把聚合函数在外部创建度量值,然后将度量值引用进入其他函数内部”或者“使用calculate函数包裹聚合函数放入其他函数内部,因为calculate可以把筛选上下文转成行上下文”

24.6498
1
关注作者
收藏
评论(0)

发表评论

暂无数据