《SUM vs. SUMX:一篇搞懂 Power BI 的迭代函數 (Iterator Functions)》
你是否也曾困惑,為什麼 DAX 裡有 SUM,還有一個長得很像的 SUMX?這個小小的 "X" 正是區分新手的關鍵。這篇文章將徹底撕掉迭代函數的神秘標籤,用一個超簡單的「購物發票」比喻,讓你一次搞懂 SUM 與 SUMX 的天壤之別,並學會駕馭整個 ...X 函數家族,讓你未來的 DAX 公式不再卡關。

你好,我是 Kiro。
新增一句:「在深入 DAX 的世界前,如果你對 Power BI 的核心概念與三大模組還不熟悉,我強烈建議你先閱讀《Power BI 是什麼?2025 年終極指南》,它會為你打下最穩固的基礎。」
歡迎來到 DAX 核心三部曲的最終章。在我們學會了用 CALCULATE
駕馭篩選上下文、用時間智慧函數穿越時空之後,現在,我們要來解鎖一個能讓你進行更精細、更強大運算的能力——迭代函數 (Iterator Functions)。
你一定有過這樣的疑惑:「為什麼 DAX 裡有 SUM
,還有一個長得很像的 SUMX
?多一個 X 到底差在哪?」
這個小小的 "X",正是區分 DAX 新手與高手的關鍵分水嶺。它代表著一種全新的運算思維,一種被稱為「迭代 (Iteration)」的強大機制。
忘掉抽象的「列上下文 (Row Context)」理論吧。這篇文章將用一個你每天都會接觸到的「購物發票」比喻,讓你一次就徹底搞懂 SUM
和 SUMX
的天壤之別,並學會駕馭整個 "...X" 函數家族,讓你未來的 DAX 公式不再卡關。
🎁 邊讀邊做,學得更快!
我同樣為這篇文章準備了專屬的 Power BI 練習檔 (.pbix
) 和範例資料 (.csv
)。免費訂閱我的電子報,即可立即前往會員資源中心下載,跟著文章一起動手操作!
簡單的開始:SUM
能做什麼?
首先,讓我們向老朋友 SUM
致敬。它的工作非常單純、專一且可靠:
SUM
的唯一任務,就是將一個「單一、已存在的欄位」裡的所有數字,全部加總起來。
假設你的銷售資料表 (sales_data_full.csv
) 長這樣:
Product | Quantity | UnitPrice | SalesAmount |
---|---|---|---|
蘋果 | 3 | 50 | 150 |
香蕉 | 2 | 30 | 60 |
櫻桃 | 5 | 100 | 500 |
如果你想計算總銷售額,SUM
會是你最直覺的選擇:
總銷售額 (SUM) = SUM('sales_data_full'[SalesAmount])
SUM
會直接鎖定 SalesAmount
這一欄,然後像計算機一樣,150 + 60 + 500
,最後回傳 710
。簡單、快速、高效。只要你需要加總的數字,已經乾乾淨淨地存在於某一欄中,SUM
永遠是你最好的朋友。
SUM
的極限:一個無法回答的問題
SUM
的專一,也正是它的最大限制。如果今天,你的資料表 (sales_data_simple.csv
) 長這樣呢?
Product | Quantity | UnitPrice |
---|---|---|
蘋果 | 3 | 50 |
香蕉 | 2 | 30 |
櫻桃 | 5 | 100 |
你的資料庫工程師告訴你,為了節省空間,他們決定不再儲存 SalesAmount
這個欄位,因為它可以透過「數量」和「單價」計算出來。
現在,老闆問你:「總銷售額是多少?」
你的第一反應可能是:「簡單!」然後寫下這樣的 DAX:
-- 這是錯誤的寫法!
錯誤的營收 = SUM('sales_data_simple'[Quantity] * 'sales_data_simple'[UnitPrice])
下一秒,DAX 引擎就會無情地給你一個錯誤。為什麼?
因為 SUM
函數的設計,只允許你放入一個欄位名稱,它不具備在加總前,先進行「乘法」這種額外運算的能力。它就像一台老式計算機,你只能給它一串數字,它才能加總,你沒辦法一邊給數字一邊叫它做別的運算。
這就是 SUM
的極限。我們需要一位更聰明、更靈活的幫手。
SUMX
登場救援!
SUMX
的誕生,就是為了解決上述的困境。為了理解它的運作方式,讓我們一起看看這張「購物發票」:
SUM
的工作模式,就像你的發票上 已經印好了「小計金額 (Line Total
)」這一欄。你只需要看著這一欄,把所有數字加起來,就能得到總金額。SUMX
的工作模式,則是你的發票上沒有「小計金額」。你必須親自動手,一行一行地看:先看「蘋果」這一行,心算3 x 50 = 150
。再看「香蕉」這一行,心算2 x 30 = 60
。再看「櫻桃」這一行,心算5 x 100 = 500
。最後,再把你腦中的這三個數字加起來:150 + 60 + 500 = 710
。
這個「一行一行地計算,最後再加總」的過程,就是 SUMX
的靈魂,也就是我們所說的「迭代 (Iteration)」。
現在,讓我們看看 SUMX
的 DAX 語法:
總營收 (SUMX) =
SUMX(
'sales_data_simple',
'sales_data_simple'[Quantity] * 'sales_data_simple'[UnitPrice]
)
SUMX
函數需要兩個核心參數:
- 第一參數 (一張表): 你要告訴
SUMX
,它要去「哪一張發票」上工作。在這裡,就是'sales_data_simple'
這張表。 - 第二參數 (一個運算式): 你要告訴
SUMX
,在發票的「每一列」上,具體要執行什麼計算。在這裡,就是'sales_data_simple'[Quantity] * 'sales_data_simple'[UnitPrice]
。
SUMX
收到指令後,就會像我們手動算發票一樣,在 'sales_data_simple'
表的每一列(這個當下的環境,就是所謂的「列上下文 Row Context」)執行一次乘法運算,在記憶體中生成一個臨時的「小計金額」列表,最後再將這個列表裡的數字全部加總 (SUM
) 起來。
這就是 SUMX
的 "X" 所代表的超能力:X = 迭代 (Iteration)。
從 SUMX
到 ...X
函數家族
一旦你理解了 SUMX
的迭代邏輯,你就能瞬間解鎖整個 "...X" 函數家族!它們的運作邏輯完全相同,只是最後的聚合動作不一樣:
AVERAGEX
:計算「平均訂單金額」
- 用途: 當你想知道每筆交易的平均價值是多少時。
- 邏輯: 它同樣會逐行計算
[Quantity] * [UnitPrice]
,但最後一步不是「加總」,而是計算所有「小計金額」的「平均值 (AVERAGE
)」。
DAX 公式:
平均訂單金額 (AVERAGEX) =
AVERAGEX(
'sales_data_simple',
'sales_data_simple'[Quantity] * 'sales_data_simple'[UnitPrice]
)
MAXX
& MINX
:找出「極端值」
- 用途: 當你想找出最大或最小的一筆訂單金額,以分析客戶行為時。
- 邏輯: 它們會逐行計算
[Quantity] * [UnitPrice]
,然後從所有結果中,分別返回最大值 (MAX
) 或 最小值 (MIN
)。
DAX 公式:
最大訂單金額 (MAXX) =
MAXX(
'sales_data_simple',
'sales_data_simple'[Quantity] * 'sales_data_simple'[UnitPrice]
)
最小訂單金額 (MINX) =
MINX(
'sales_data_simple',
'sales_data_simple'[Quantity] * 'sales_data_simple'[UnitPrice]
)
結論:讓 "X" 成為你的武器
現在,SUM
和 SUMX
之間的選擇應該非常清晰了:
- 當你需要加總的數字已經存在於一個單獨的欄位時,使用最簡單、最高效的
SUM
。 - 當你需要先對每一列進行計算(例如乘法、除法、複雜的邏輯判斷),然後再將這些計算結果進行聚合(加總、平均、找最大/最小值)時,
...X
迭代函數家族就是你唯一的選擇。
掌握迭代函數,意味著你不再受限於資料庫中已有的欄位。你可以根據業務邏輯,動態地創造出新的指標,進行精細化的利潤分析、計算複雜的加權平均、或是找出極端的交易行為。
這是你從數據的「消費者」轉變為「創造者」的關鍵一步。
下一步:將理論化為實戰
🎁 下載練習檔,親手操作!
為了讓你親身體驗 SUM
的極限與 ...X
家族的威力,我已經準備好了這篇文章的完整 Power BI 練習檔 (.pbix
) 和所有範例資料 (.csv
)。
立即免費訂閱我的「人生算法」實踐筆記,即可前往會員資源中心下載練習檔!
🚀 準備好接受更深度的挑戰了嗎?
理解迭代函數只是開始。在真實的商業世界裡,你會需要將 SUMX
與 CALCULATE
、FILTER
等函數結合,創造出威力無窮的分析模型。
如果你渴望將迭代函數應用在真實的商業專案中,我誠摯地邀請你加入我在 Hahow 好學校的線上課程。
【Power BI x AI 終極實戰:打造高效數據分析工作流】
在課程中,我們將透過「人力資源分析」等專案,實戰演練如何用 SUMX
和 AVERAGEX
計算複雜的指標,並用 AI 輔助你理解和撰寫這些公式。這不只是一堂工具課,更是一趟將你打造成真正資料專家的旅程。