跳至主要内容

如何使用 Power BI 中的 SUMX 函数

探索 Power BI 中的 SUMX 函数、其语法、工作原理以及需要注意的最佳实践。
· 8分钟 阅读

使用 AI 探索

如果您刚刚通过我们的Power BI 数据分析师职业路径开始学习 Power BI,您可能已经在DAX 入门课程中了解了基本的 SUM 函数(如未了解,可先阅读这篇快速DAX 教程)。在这种情况下,您或许也会好奇 SUMX 函数是什么、如何工作,以及如何在分析中使用它。

本教程将深入介绍 SUMX 函数,解答上述问题,并指导您在 Power BI 中加以实现。

在学习本篇和其他 Power BI 教程时请记住,尽管作为商业智能或 Power BI 开发人员未必被要求学习编程,但这可能会成为您职业发展的重要助力。阅读我们的文章,了解作为 BI 分析师是否应该学习编程及其原因。

什么是 Power BI 中的 SUMX 函数?

Power BI 中的 SUMX 是一个功能强大的 DAX 函数,用于对表中每一行计算出的表达式求和。此函数之所以重要,是因为它允许进行比简单求和更复杂的计算。

随手备一份我们的DAX 速查表,可快速参考常用的 DAX 函数。

image2.png

SUMX 函数的语法为

SUMX(Table, Expression)

  • Table:函数迭代的表或表表达式。
  • Expression:在表的每一行上进行求值的表达式。该表达式通常涉及该表中的列数据。

当您需要先基于每行的数值进行计算,再对结果求和时,SUMX 尤其有用。例如,通过将每笔交易的数量与价格相乘来计算总销售额,或在求和前按产品应用不同的折扣率。它为您的计算提供了灵活性和精确性,因此非常值得学习。

SUMX 在 Power BI 中如何工作

以下是 SUMX 函数底层工作方式的拆解:

  • 调用 SUMX 时,它会逐行迭代指定的表。对于每一行,它会临时建立一个行上下文,这是一种可直接访问当前行数值的环境。
  • 在该行上下文中,函数会对其第二个参数提供的表达式进行求值。该表达式通常涉及当前行的一列或多列的值。函数在遍历表的过程中,会基于该行的数据为每一行重新计算该表达式。
  • 当 SUMX 处理每一行时,它会对结果进行聚合并维护一个累积总计。Power BI 使用 DAX 的内存分析引擎(VertiPaq),该引擎针对这类计算进行了优化。
  • 遍历所有行后,SUMX 会最终得到聚合总计,即对每行计算结果求和的值。该最终值即为函数的返回结果。

理解上下文

在 Power BI 中,上下文对于理解像 SUMX 这样的 DAX 函数如何运行至关重要。上下文决定数据模型中的值如何被计算和展示。请查看我们的DAX 入门课程,其中更详细地讨论了上下文。使用 SUMX 时,主要需考虑两种上下文:行上下文和筛选上下文。

行上下文

行上下文指 DAX 公式按表的每一行进行求值的环境。在行上下文中,您可以直接引用该表的列,DAX 会在计算中使用当前行的值。

当您使用 SUMX 时,它会为其操作创建并利用行上下文。对于指定表中的每一行,SUMX 都会在该特定行的上下文中求值所给表达式。

筛选上下文

筛选上下文是指应用于 Power BI 报表数据的一组筛选,例如来自可视化对象、切片器和报表级筛选器的筛选。该上下文决定在计算中会考虑哪些数据点。

尽管 SUMX 为逐行计算在行上下文中运行,但这些计算仍受报表或可视化的整体筛选上下文约束。这意味着 SUMX 迭代的行是符合当前筛选上下文所定义条件的那些行。

SUMX 中上下文之间的交互

使用 SUMX 时,该函数会同时遵循行上下文和筛选上下文。SUMX 迭代的表由筛选上下文决定,而每一行的计算则在行上下文中完成。

您可以在 SUMX 中使用度量值。在这种情况下会发生上下文转换,即为对每一行计算该度量值,行上下文会临时转换为等效的筛选上下文。

SUMX 的最佳实践

在 Power BI 中使用 SUMX 函数时,请考虑以下一些最佳实践:

  • 在应用 SUMX 之前确保您的数据模型结构良好。正确定义的关系和模型架构对于准确且优化的 Power BI 报表至关重要。
  • 在计算列或行级安全规则中使用时,SUMX 在 DirectQuery 模式下不受支持。
  • 尽量让 SUMX 中使用的表达式保持简单高效。避免过于复杂的计算,特别是在大型数据集上,以免影响性能。
  • 注意上下文转换及其对函数结果的影响。
  • SUMX 仅考虑数值。空白、逻辑值和文本将被忽略。

SUMX 与其他函数的比较

有些函数与 SUMX 类似,选择何时使用哪一个可能有些混淆。我们来梳理两个最常引起困惑的函数。

SUMX vs SUM

SUM 用于对表中的某一列求和,其语法如下:

SUM(Column)

SUMX 会对每一行进行迭代以求值表达式,而 SUM 则直接对单列的值进行聚合。这意味着 SUMX 能处理涉及多列的更复杂的计算。

然而,与 SUM 相比,SUMX 的迭代特性会占用更多资源,尤其是在大型数据集上。如果您正在处理庞大的数据模型,请牢记这一点,对于简单求和尽量使用 SUM。

SUMX vs CALCULATE

CALCULATE 会修改计算的筛选上下文,是 DAX 中最强大的函数之一。其语法如下:

CALCULATE(Expression, Filter1, Filter2,...)

当您需要在与当前应用于报表或模型不同的筛选条件下执行计算时,CALCULATE 非常理想。相对地,SUMX 用于逐行计算并在其后进行聚合。

在复杂场景中,我们可以将 CALCULATE 与其他函数(如 SUMX)结合使用。例如,您可以用 CALCULATE 定义一个特定的筛选上下文,在该上下文中,SUMX 再执行其逐行计算与聚合。

在 Power BI 中实现 SUMX:分步指南

使用 Power BI 示例数据(安装 Power BI Desktop 时可用),我们将演示如何使用 SUMX 函数,以及如何将 SUMX 与其他有用的 DAX 函数结合。

下面是我们的数据快照,展示了不同产品在各个细分市场和国家的月度销售情况。

image4.png

步骤 1:使用 SUMX 创建度量值

以下是 SUMX 强大功能的经典示例。我们希望使用售出数量、单价以及任何折扣的数值来计算总销售额。

SUMX(Sales, (Sales[Units Sold] * Sales[Sale Price])-Sales[Discounts])

下面的表格显示了我们的 SUMX 函数结果。您可以看到,总销售额同样可以应用筛选上下文——在此示例中,我们按年份和产品进行筛选。

image1.png

步骤 2:为 SUMX 应用筛选

我们可以通过两种方式在 SUMX 中使用筛选:使用 FILTER 或 CALCULATE。

FILTER 用于在 SUMX 内对表或表达式应用特定筛选。它可以更精细地控制 SUMX 要迭代的行。

SUMX(FILTER(Sales, Sales[Discount Band] = "High"), Sales[Units Sold])

CALCULATE 则会修改 SUMX 的筛选上下文,从而实现复杂的条件聚合。

SUMX(Sales, CALCULATE(SUM(Sales[Units Sold]), Sales[Year] = 2020))

步骤 3:将 SUMX 与其他函数组合

ALL 和 ALLEXCEPT

这些函数用于从某个表或除指定表以外的所有表中移除筛选。它们常与 CALCULATE 一起,并结合 SUMX 使用,以便在未筛选的数据集上执行计算。

SUMX(ALL(Sales), Sales[Sale Price] * Sales[Units Sold])

VALUES

VALUES 返回某列唯一值的一列表。您可以将其与 SUMX 结合,用于需要遍历唯一值的计算。

SUMX(VALUES(Sales[Country]), [Total Sales])

AVERAGEX、MINX 和 MAXX

这些是与 SUMX 类似的其他迭代函数,分别用于计算平均值、最小值或最大值。它们可以与 SUMX 嵌套或并用。

AVERAGEX(Customers, SUMX(RELATEDTABLE(Sales), Sales[Units Sold]))

IF 和 SWITCH

IF 和 SWITCH 等逻辑函数可在 SUMX 中使用,以执行条件计算。

SUMX(Sales, IF(Sales[Country] = "Mexico", Sales[Units Sold], 0))

USERELATIONSHIP

USERELATIONSHIP 指定在计算中使用的特定关系。当表之间存在多重关系时尤其有用。

SUMX(CALCULATETABLE(Sales, USERELATIONSHIP(Date[Date], Sales[Date])), Sales[Units Sold])

结论

在本教程中,我们深入解析了 Power BI 中的 SUMX 函数,并演示了如何自行实现。它不仅是一个灵活而强大的 DAX 函数,也体现了理解 DAX 上下文的重要性。想要了解更多,请查看我们的Power BI 基础技能路径。

Joleen Bothma

作者

Joleen Bothma

主题