引言:为什么我们要在 2026 年重新审视这两个函数?
当我们开始深入学习 Power BI 的数据模型和 DAX 语言时,理解其背后的计算引擎至关重要。在我们的技术社区中,经常看到开发者因为混淆了这两种思维而导致报表性能瓶颈或逻辑错误。Power BI 主要依赖两个核心计算引擎:聚合引擎和迭代引擎。对于许多初学者甚至是有经验的开发者来说,SUM() 和 SUMX() 这两个函数的区别往往显得非常模糊。虽然它们在许多情况下都能返回我们想要的结果,但在处理复杂逻辑、性能优化以及特定业务场景时,选择正确的函数不仅能让代码更简洁,还能避免潜在的逻辑错误。
在这篇文章中,我们将深入探讨这两个函数的本质区别,并通过实际的代码示例,展示如何在不同的业务场景中做出最佳选择。特别是在 2026 年的今天,随着数据量的爆炸式增长和 AI 辅助编程(如 Agentic AI)的普及,理解这种底层的差异变得比以往任何时候都重要。你将了解到什么是“聚合思维”,什么是“迭代思维”,以及掌握 SUMX 如何让你在处理行级上下文计算时游刃有余,甚至如何利用现代 AI 工具来优化你的 DAX 代码。我们将结合“氛围编程(Vibe Coding)”的现代开发理念,探讨如何让 AI 成为你编写高效 DAX 的最佳搭档。
聚合函数 vs 迭代函数:核心概念解析
在 DAX 中,函数主要分为两类:聚合函数和迭代函数。理解这一分类是掌握高级 DAX 的基石。作为开发者,我们不仅要会用,还要懂引擎在背后到底做了什么。
聚合函数以 SUM、AVERAGE、MIN、MAX 和 COUNT 为典型代表。它们的工作方式是“列优先”的。当我们在 CALCULATE 或直接在度量值中使用 SUM 时,引擎会查看当前的筛选上下文,确定相关联的整列数据,然后一次性对该列中的所有可见值进行求和。聚合函数并不关心表中有多少行,它只关心那一列中剩余的数字是什么。它的优势在于速度快,因为它直接利用了存储引擎的预聚合能力。
迭代函数则完全不同,它们通常以 X 结尾,例如 SUMX、COUNTX、AVERAGEX 等。迭代函数的工作方式是“行优先”的。当你使用一个迭代函数时,DAX 引擎会创建一个行上下文,逐行遍历指定的表。对于表中的每一行,它都会先执行你定义的表达式逻辑,计算出这一行的结果,最后将所有行的计算结果汇总起来。虽然这听起来比聚合函数慢,但它提供了无可比拟的灵活性。
简单来说:
- SUM: “直接把这一桶数字加起来。”(操作空间:列)
- SUMX: “先看每一行,算出一个数,然后把算出来的数加起来。”(操作空间:行上下文)
SUM 聚合引擎:简单直接的加法
SUM 是最基础也是最常用的聚合函数。它将单列中的每个数字值相加,并返回一个十进制标量值。由于它属于聚合引擎,它无法感知“行”的存在,只能对整列进行操作。在 2026 年的 VertiPaq 引擎中,SUM 操作通常能被极快地处理,因为它本质上是读取压缩后的元数据。
#### 语法结构
> 语法: SUM()
- column: 要进行求和的列,必须是包含数值的物理列。注意,它不能是表达式或度量值。
#### 适用场景与局限性
SUM 的最大优势在于简洁和性能。当我们只需要简单地将一列现有数字加总时,它是首选。然而,它的局限性也非常明显:它无法直接基于行级别的逻辑进行计算。例如,如果你想在求和前先根据同一行的其他列进行乘法或条件判断(如 单价 * 数量),SUM 就无能为力了,因为它不能同时引用两列进行逐行运算。
#### 实战演练:使用 SUM 计算总销售额
让我们通过一个实际的零售数据集来看看 SUM 是如何工作的。假设我们有一个名为 INLINECODEbe5513ca 的表,其中包含 INLINECODE775240d5(销售额)列,我们想要计算总销售额。
示例度量值:
// 这是一个非常基础的度量值,用于计算 Orders 表中 Sales 列的总和
Total Sales = SUM(Orders[Sales])
代码解析:
在 Power BI 中输入上述代码后,SUM 函数会接收当前的筛选上下文。例如,如果我们把“Category(类别)”放入报表的切片器或图表轴中,SUM 会根据当前选中的类别,只将该类别对应的 Orders[Sales] 列中的值相加。这个过程不需要创建任何行上下文,纯粹是列操作。
SUMX 迭代引擎:强大的逐行逻辑处理
如果说 SUM 是一把大锤,那么 SUMX 就是一把手术刀。SUMX 允许我们在求和之前对每一行数据进行复杂的逻辑处理。在现代数据建模中,我们经常需要处理“计算后”再聚合的需求,这正是 SUMX 的主场。
#### 语法结构
> 语法: SUMX(