何时使⽤SUM()与SUMX()
概述
SUM()是⼀个聚合函数。在应⽤将影响公式的所有过滤器后,它会将您指定的单个列中的所有值相加。SUM()不知道⾏的存在(它不能逐⾏求值) - 它所能做的就是在应⽤过滤器之后将所有内容添加到它所呈现的单列中。
SUMX()是⼀个迭代器函数。它应⽤于⼀个表,⼀⾏⼀⾏地应⽤所有过滤器后完成求值。  SUMX()具有表中⾏的感知,因此可以引⽤每⾏与表中任何列的交集。SUMX()可以在单个列上运⾏,但也可以在多个列上运⾏ - 因为它具有逐⾏⼯作的能⼒。
综上所述
·SUM()在单个列上运⾏,并且不知道列中的各个⾏(没有逐⾏求值)。
·SUMX()可以对表中的多个列进⾏操作,并且可以在这些列中完成逐⾏求值。
这两个功能可以最终给你同样的结果(也许是,也许不是)。它们通常在矩阵给出相同的结果,但通常在视觉的⼦总数和总计部分中给出不同的结果。
SUM()函数
语法:= SUM(<;列名>)
⽰例:总销售额= SUM(销售表[销售额])
SUM()函数在单个数据列上运⾏,以聚合该单个列中的所有数据并应⽤当前过滤器 - ⾸先过滤,然后评估第⼆个。
powerbi官方电脑版下载
SUMX()函数
语法:= SUMX(<Table>,<expression>)
⽰例:总销售额SUMX = SUMX(销售表,销售表[数量] *销售表[单位价格])
SUMX()将迭代第⼀个参数中指定的表,⼀次⼀⾏,并完成第⼆个参数中指定的计算,例如数量x单位价格,如上例所⽰,当前过滤器已应⽤(即仍然⾸先过滤,求值第⼆)。⼀旦它对指定表中的每⼀⾏(在应⽤当前过滤器之后)完成此操作,它就会累计所有逐⾏计算的总和以获得总计。结果返回此总数。
那么我应该使⽤哪⼀个呢?
您使⽤哪种⽅式取决于您的个⼈偏好和数据结构。我们来看⼏个例⼦。
1数量和每单位价格
2延期⾦额
3总计不要加起来
1.数量和价格
如果您的销售表包含数量列和“单价”的另⼀列(如上所⽰),那么您必须将“数量”乘以“单价”以便获得总销售额。将总量SUM(数量)加起来并将其乘以平均单价是不合适的,因为这将给出错误的答案。
如果您的数据以这种⽅式构建(如上图所⽰),那么您只需要使⽤SUMX() - 这就是迭代器函数的设计⽬的。这是公式的样⼦。
总销售额1 = SUMX(销售表,销售表[数量] *销售表[单价])
2.延期⾦额
如果您的数据包含具有该⾏项⽬的扩展总销售额的单个列(即,它没有每单位的数量和价格),则可以使⽤ SUM()来累加值。
总销售额2 = SUM(销售表[销售额])
在此⽰例中不需要迭代器,因为在这种情况下,它只是跨单个列的简单计算,并且不需要逐⾏执⾏。但请注意,你仍然可以使⽤SUMX()(如下所⽰),它会给你相同的答案。
总销售额2替代= SUMX(销售表,销售表[销售额])
并且使⽤SUMX()的替代公式在性能和效率上与SUM()是相同的.
3.总计不要加起来
当你必须使⽤不那么明显的SUMX()时,还有另⼀个⽤例。当您遇到总计不按需要/期望加起来的问题时,您将需要使⽤像SUMX这样的迭代器来纠正问题。我已经创建了⼀个⼩样本数据表来解释。
上表显⽰了4位客户,他们每次购物时平均花费的⾦额以及他们购物的次数。如果我将这些数据加载到Power BI中,然后尝试使⽤聚合器函数来查所有客户的平均⽀出以及花费的总⾦额,我会在总⾏中得到错误的答案(如下所⽰)。
以下是上述措施:
总访问次数= SUM(购物表[访问次数]) - 该公式的总数是正确的。
每次访问平均花费=AVERAGE(购物表 [每次访问花费]) - 这⾥的总数是错误的。
总⽀出= [每次访问费⽤] * [访问总次数] - 这⾥的总数也是错误的。
第⼀个度量[访问总数]是正确的,因为数据是加性的,但其他2个度量给出了错误的结果。这是⼀个典型的情况,你⽆法在总体⽔平上对平均值进⾏乘法运算。鉴于我开始使⽤的样本数据,计算正确答案的唯⼀⽅法是为表中的每个客户完成逐⾏评估,如下所⽰。
在上⾯的第⼆个表中,我编写了⼀个SUMX()来⾸先创建Total Spent SUMX(逐⾏)。只有这样我才能计算每次访问的平均花费作为最终公式。
总访问次数= SUM(购物表[访问次数])
总花费= SUMX(购物表,购物表 [每次访问花费] *购物表[访问次数])
每次访问平均花费= DIVIDE([总花费SUMX], [总访问量])
在第⼆种情况下,SUMX正在⼀次⼀⾏地处理数据表并正确计算结果,即使对于表底部的总⾏也是如此。
性能影响存储引擎
我要谈的最后⼀件事是使⽤SUM与SUMX的性能影响。鉴于SUMX是⼀个迭代器,您可能认为SUMX本质上是低效的。⼀般来说,这不是真的,因为软件已经过优化以有效地处理场景。话虽如此,糟糕的DAX肯定会导致SUMX效率低下。
Power Pivot有2个计算引擎,存储引擎(SE)和公式引擎(FE)。SE更快,多线程和缓存。FE速度较慢,单线程且未缓存。这本⾝就是⼀个复杂的主题,我将只讨论表⾯,但其含义是您应该编写公式以尽可能利⽤SE。当然,如果您不确切知道如何做到这⼀点,这可能很难,但有⼀些简单的提⽰可以帮助您。
1.SUM()总是使⽤SE进⾏计算,因此⽆需担⼼。
2.对于⼤多数简单的计算(如Sales [数量] *销售[单位价格]),SUMX()也将使⽤SE,所以那⾥都很好。
3.在某些情况下,SUMX()可以使⽤FE执⾏部分或全部计算,特别是如果公式中有复杂的⽐较语句。
如果SUMX需要使⽤FE,那么性能可能会很慢 - 有时⾮常慢。
关于第3点,最好建议是避免在SUMX函数中编写复杂的条件语句,如“IF语句”。考虑以下两个公式:
物品总销售额超过100美元
= SUMX(销售,
IF(销售[ExtendedAmount]> 100,销售[ExtendedAmount])
物品总销售额超过100美元
=CALCULATE
SUMX(销售,销售[ExtendedAmount]),
销售[ExtendedAmount]> 100
第⼀个公式(Bad)在SUMX中有⼀个IF语句。此IF语句强制存储引擎将求值任务传递给公式引擎以进⾏⽐较检查,以确定每个单独的⾏是否⼤于100,然后再决定是否将其包括在计算中。因此,公式引擎必须⼀次完成⼀⾏任务,使评估变得缓慢且低效。
第⼆个公式(Good)⾸先使⽤CALCULATE()修改来⾃visual的初始过滤器,以在Sales [ExtendedAmount]> 100上添加额外的过滤器。这个新过滤器由存储引擎⾮常有效地应⽤。在CALCULATE()修改过滤器之后,SUMX()可以完成其⼯作,即使⽤存储引擎(⽽不是公式引擎)应⽤新的过滤器集合来添加剩余的⾏。结果,这第⼆个公式⾮常有效。在我完成的⼀些简单测试中,第⼀个(坏)公式⽐第⼆个(好)公式慢了5倍。在其他情况下,它可能会慢100或甚⾄1000倍,所以这显然可能是⼀个问题。
压缩对性能的影响
可影响性能的第⼆个领域是整体数据模型压缩。数据模型中的列中存在的唯⼀值越多,数据的压缩程度就越低。数据压缩得越少,所需的内存就越多,计算速度就越慢。让我们再看⼀下本⽂前⾯的表格。
⽰例表1
⽰例表1[Total Sales]数据列具有所有唯⼀值。此列不能很好地压缩。
⽰例表2
在此表中,Qty列中还有重复值,还有每单位价格列。列中的唯⼀值越少,压缩越好。
当然,这两个样本表当然⾮常⼩,但想象⼀下这个概念对⾮常⼤的表(例如具有数百万⾏数据的表)的影响。对于⾮常⼤的表,⽰例表1中的唯⼀值的数量可能远远⼤于⽰例表2中的列中的唯⼀值的数量。因此,如⽰例2中所述的加载数据可能具有对总表⼤⼩产⽣积极影响,从⽽影响数据模型的性能。做出改变当然可能意味着你必须交换你的措施:
SUM(销售[总销售额])
SUMX(销售,销售[数量] *销售[单位价格])
SUMX⽐起SUM的这种⽤法⾮常精细并且有更⾼的性能。
1.Power BI免费下载:
Microsoft Power BI Desktop中⽂最新版:
2.欢迎加⼊的Power BI技术,⽬前正在学习阶段,有兴趣的朋友可以⼀起学习讨论。
Power Data技术交流:702966126 (验证注明:博客园Power BI)
更多精彩内容请关注:悦策PowerBI
如果您觉得阅读本⽂对您有帮助,请点⼀下“推荐”按钮,您的“推荐”将是我最⼤的写作动⼒!欢迎各位转载,作者博客:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。