![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5SM1IWN2MGNycTZ3YmYjRTM5EzM0MmZ0MjY1kTOzUTO38CX0EzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.jpeg)
SUMMARIZE函數非常強大,掌握以後表面上看也非常好用,是以我專門寫篇文章介紹一下這個函數,至于是否一定要使用該函數,請看完再決定。
SUMMARIZE,單純從英文語義上看,是彙總、總結的意思,而它的功能,确實也就是彙總,它可以傳回一個彙總表。
你可以從官方的文檔中查詢到該函數的說明,
https://docs.microsoft.com/en-us/dax/summarize-function-dax
它的參數非常複雜和難以了解,參數很多,并且有些參數都是可選的、可重複的。直接靠文檔不容易了解,我們可以根據執行個體來了解它的用法。
它的參數很多是可選的,讓我們按參數由少到多逐漸看看它的功能。
01 | 提取次元表
以下表達式,會提取不重複的産品名稱:
次元表1 = SUMMARIZE('訂單','訂單'[産品名稱])
SUMMARIZE函數的第一個參數是表,第二個參數是列時,會傳回該列的不重複清單,其功能與VALUES相似。
不過SUMMARIZE函數還可以繼續添加第三個、第四個參數列…,看以下表達式的傳回結果,
次元表2 = SUMMARIZE('訂單','訂單'[産品名稱],'日期表'[年度])
SUMMARIZE參數表後面跟多個列時,它會傳回這些列的有效組合,類似于笛卡爾積,與笛卡爾積稍微不同的是,如果在訂單表中不存在這個組合,則傳回的清單中,就不會出現這一行。
舉個例子,假如2016年如果沒有賣過智能手表,則上述的表達式不會有2016 智能手表這一行。
02 | 傳回彙總表
在上述表達式的基礎上,我們繼續添加參數如下:
彙總表1 =
SUMMARIZE(
'訂單',
'日期表'[年度],
'訂單'[産品名稱],
"銷售額合計",SUM('訂單'[銷售額])
)
SUMMARIZE參數後面帶上列名和表達式時,它會自動計算并傳回分組的彙總表,這才是該函數的本質功能,也切合它的字面意義。
這個功能非常好用,也是我們使用它最普遍的地方。
03 | 傳回帶合計的彙總表
這是SUMMARIZE的進階功能,在上面的表達式中的分組列外面套一層ROLLUP,看看是什麼效果?
彙總表2 =
ROLLUP('日期表'[年度],'訂單'[産品名稱]),
看到在彙總表的下面還多了幾行合計數,這就是ROLLUP參數的作用。它隻在SUMMARIZE内部使用,用于為子類别計算小計和總計。
SUMMARIZE内部還可以使用一個參數是ROLLUPGROUP,使用ROLLUPGROUP代替上面表達式中的ROLLUP,可以傳回相同的結果。
不過如果在上面表達式ROLLUP裡面再套一層ROLLUPGROUP,
彙總表3 =
ROLLUP(ROLLUPGROUP('日期表'[年度],'訂單'[産品名稱])),
分組的小計不見了,隻傳回了總計, ROLLUP和ROLLUPGROUP組合可以避免出現小計,而隻傳回總計。這樣使彙總表看起來更像是Excel中的透視表。
關于ROLLUP和ROLLUPGROUP參數,其實它們的合計功能并不常用,但是卻導緻很多人覺得SUMMARIZE很複雜,你如果也是這種感覺,完全可以不用深究這兩個參數的用法,因為你基本上也不會用到它們。
SUMMARIZE最常用的還是上面的第二種功能,讓我們回頭再來看看這種用法,傳回一個彙總表确實非常實用,但是這是最優的寫法嗎?
使用ADDCOLUMNS傳回彙總表
02示例中的表達式,還可以用以下表達式代替,
彙總表4 =
ADDCOLUMNS(
SUMMARIZE(
'訂單',
‘日期表'[年度],
'訂單'[産品名稱]
),
"銷售額合計",CALCULATE(SUM('訂單'[銷售額]))
即通過ADDCOLUMNS函數,在SUMMARIZE生成分組的基礎上添加列,來計算銷售額彙總,可以傳回相同的結果,但是在性能上,要比單純的使用SUMMARIZE更優。
SUMMARIZE函數由于性能和内部相容性等方面的原因,并不建議使用它來進行彙總,可以使用上面的ADDCOLUMNS和SUMMARIZE組合來代替,另外還有個新函數性能更優:SUMMARIZECOLUMNS。
使用SUMMARIZECOLUMNS傳回彙總表
依然是生成上面的彙總表,SUMMARIZECOLUMNS的寫法:
彙總表5 =
SUMMARIZECOLUMNS(
是不是看起來更加簡潔,它的第一個參數不再需要表,而是直接是分組列,實踐上看,它的性能要優于ADDCOLUMNS和SUMMARIZE組合,當然也遠優于SUMMARIZE,生成彙總表時建議直接用SUMMARIZECOLUMNS(關于性能,你可以使用DAX Studio進行測試)。
SUMMARIZECOLUMNS應該就是為了替代SUMMARIZE而出現的,它可以實作SUMMARIZE的功能;SUMMARIZE的内部參數,比如ROLLUPGROUP等,SUMMARIZECOLUMNS同樣也有,并且還有更多其他内部參數可以調用,不過對于普通DAX使用者來說,可能并不會使用到,就不再介紹了,想深入了解的請自行查閱該函數文檔。
總結
- 提取多列的有效組合時,可以使用SUMMARIZE
- 傳回彙總表時,推薦使用SUMMARIZECOLUMNS
/推薦閱讀/