|

DAX基础–SUM 和 SUMX

18

把一件事倒到极致,胜过把万件事做到平庸

SUM和SUMX是两个最基础的聚合函数,很多时候后面一系列复杂度量的书写都是基于这两个函数写的基础度量。这两个函数很像,但还是有很大的区别的

SUM

SUM语法很简单,对列中的所有数值进行求和,比如

Sales Amount = SUM( 'Fact_Sales'[Sales Amount] )

如果我们要算销售利润呢,初学者可能会想到销售额-成本再汇总,但是会发现PowerBI提示了错误,而且在我们写后面 -‘Fact_Sales'[Total Product Cost]时并没有触发PowerBI的智能提示,这是因为SUM只接受列引用作为参数。

当然我们也可以写两个SUM的值相减

Sum of Margin = SUM( 'Fact_Sales'[Sales Amount] ) - SUM ( 'Fact_Sales'[Total Product Cost] )

其实,还有更简单的方法,这就需要使用SUMX了。


SUMX

SUMX ( <Table>, <Expression> )

相对于SUM,SUMX的语法要复杂些,有两个参数

  • 参数1,表或表表达式

  • 参数2, 求值表达式

Sum of Margin2 = SUMX( 'Fact_Sales', 'Fact_Sales'[Sales Amount] - 'Fact_Sales'[Total Product Cost] )

这时,我们已经可以发现他们的区别,在使用SUM时不需要指定表名,因为某一列只属于具体的某一张表;但SUMX中可能会存在需要其他表中列的表达式。换句话说SUM只是某一列值的汇总,而SUMX是一个表达式的汇总。

此外,SUM在内部执行SUMX,即

Sales Amount = SUM( 'Fact_Sales'[Sales Amount] )
// 等价于
Sales Amount = SUMX( 'Fact_Sales', 'Fact_Sales'[Sales Amount]
)

SUMX不止是一个聚合函数,它还是一个迭代器,迭代器函数循环遍历输入表中的所有行,并将逐行应用表达计算的结果存储在内存中,最后再对内存中存储的结果进行聚合计算,并释放内存。迭代器还有很多,比如MINX,MAXX等等。

再来看SUMX的用法,它的第一个参数可以是一个表表达式,

Total Margin = SUMX(    ALL( 'Fact_Sales' ),    'Fact_Sales'[Sales Amount] - 'Fact_Sales'[Total Product Cost] )

也可以是下面这样

Sum of Margin for Bikes = SUMX(    FILTER(        'Fact_Sales',        RELATED( 'Dim_Product'[Category] ) = "Bikes"    ),'Fact_Sales'[Sales Amount] - 'Fact_Sales'[Total Product Cost] )



本篇文章来源于微信公众号: PowerBI木小桼

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注