我是靠谱客的博主 活力汉堡,最近开发中收集的这篇文章主要介绍CALCULATE函数的运算顺序-第一弹,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

CALCULATE函数应该算是DAX语言中用的最广,最神奇,也最容易理解出错的一个函数。它具有重新设定筛选上下文,并且将行上下文转换为筛选上下文的能力。

在DAX函数中,绝大多数函数的执行顺序都是从左到右依次进行,例如SUMX函数SUMX(<table>,<expression>),如果table参数处使用了一个可以返回表单的表达式,则在运行时Power BI会先将这个表单表达式的结果计算出来,之后再计算expression参数部分。而CALCULATE函数CALCULATE(<expression>,<filter1>,<filter2>…)则很特殊,Power BI会先对后面的filter参数部分进行计算,之后才会运行expression表达式部分。

CALCULATE函数这种独特的从“右”到“左”的运算顺序会对运算结果产生什么样的影响呢?且看下面这个表单例子。

TotalSales = SUM('Sales SalesOrderHeader'[TotalDue])

在这里插入图片描述
如果创建下面这个度量值C1来计算France的产品销量,猜猜会有什么样的结果。

C1 =
CALCULATE (
    [TotalSales],
    'Sales SalesTerritory'[Name] = "France"
)

hmm,一般觉得应该只有France这一行有相应的计算结果,而其他国家对应的值都是空?但其实结果如下图所示:

在这里插入图片描述
对比第一张图的原始数据,France这一行的计算结果是没有问题的,但是其他国家的值也都被赋予了France的对应的销量值。

之所以出现这样的结果就是跟CALCULATE函数的筛选表达式使用布尔函数时,其含义相当于调用了FILTER函数并使用了ALL函数作为FILTER函数内的筛选条件。按照这个逻辑,前面的C1表达式等同于下面这个包含C2表达式:

C2 =
CALCULATE (
    [TotalSales],
    FILTER (
        ALL ( 'Sales SalesTerritory'[Name] ),
        'Sales SalesTerritory'[Name] = "France"
    )
)

之前说过,CALCULATE函数的计算顺序是从“右”到“左”,所以Power BI在对C2进行运算时,会先计算FILTER函数部分。FILTER里面有一个超级无敌去筛选条件的ALL函数,所以在这个函数的作用下,外面的筛选上下文对计算结果都将起不到过滤作用。此时,FILTER函数的返回结果变成了只包含’Sales SalesTerritory’[Name] = "France"的子表单,这样,内嵌度量值[TotalSales]的计算范围就被限定到了只针对France列数据进行聚合,所以无论外围可视化表单设定了何种筛选条件,C1和C2都只会执着的显示8119749.346这个结果。

最后

以上就是活力汉堡为你收集整理的CALCULATE函数的运算顺序-第一弹的全部内容,希望文章能够帮你解决CALCULATE函数的运算顺序-第一弹所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部