數據可視化之DAX篇(十九)值得你深入了解的函數:SUMMARIZE


https://zhuanlan.zhihu.com/p/66424209

SUMMARIZE函數非常強大,掌握以后表面上看也非常好用,所以我專門寫篇文章介紹一下這個函數,至於是否一定要使用該函數,請看完再決定。

 


 

SUMMARIZE,單純從英文語義上看,是匯總、總結的意思,而它的功能,確實也就是匯總,它可以返回一個匯總表。

你可以從官方的文檔中查詢到該函數的說明,

它的參數非常復雜和難以理解,參數很多,並且有些參數都是可選的、可重復的。直接靠文檔不容易理解,我們可以根據實例來理解它的用法。

它的參數很多是可選的,讓我們按參數由少到多逐步看看它的功能。

01 | 提取不重復值

以下表達式,會提取不重復的產品名稱:

維度表1 = SUMMARIZE('訂單','訂單'[產品名稱])

 

 

SUMMARIZE函數的第一個參數是表,第二個參數是列時,會返回該列的不重復列表,其功能與VALUES相似。

不過SUMMARIZE函數還可以繼續添加第三個、第四個參數列…,看以下表達式的返回結果,

維度表2 = SUMMARIZE('訂單','訂單'[產品名稱],'日期表'[年度])

 

 

SUMMARIZE參數表后面跟多個列時,它會返回這些列的有效組合,類似於笛卡爾積,與笛卡爾積稍微不同的是,如果在訂單表中不存在這個組合,則返回的列表中,就不會出現這一行。

舉個例子,假如2016年如果沒有賣過智能手表,則上述的表達式不會有2016 智能手表這一行。

02 | 返回匯總表

 

在上述表達式的基礎上,我們繼續添加參數如下:

匯總表1 =
SUMMARIZE(
'訂單',
'日期表'[年度],
'訂單'[產品名稱],
"銷售額合計",SUM('訂單'[銷售額])
)

 

 

SUMMARIZE參數后面帶上列名和表達式時,它會自動計算並返回分組的匯總表,這才是該函數的本質功能,也切合它的字面意義。

這個功能非常好用,也是我們使用它最普遍的地方。

 

03 | 返回帶合計的匯總表

 

這是SUMMARIZE的高級功能,在上面的表達式中的分組列外面套一層ROLLUP,看看是什么效果?

匯總表2 =
SUMMARIZE(
'訂單',
ROLLUP('日期表'[年度],'訂單'[產品名稱]),
"銷售額合計",SUM('訂單'[銷售額])
)

 

 

看到在匯總表的下面還多了幾行合計數,這就是ROLLUP參數的作用。它只在SUMMARIZE內部使用,用於為子類別計算小計和總計。

SUMMARIZE內部還可以使用一個參數是ROLLUPGROUP,使用ROLLUPGROUP代替上面表達式中的ROLLUP,可以返回相同的結果。

不過如果在上面表達式ROLLUP里面再套一層ROLLUPGROUP,

匯總表3 =
SUMMARIZE(
'訂單',
ROLLUP(ROLLUPGROUP('日期表'[年度],'訂單'[產品名稱])),
"銷售額合計",SUM('訂單'[銷售額])
)

 

 

分組的小計不見了,只返回了總計, 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(
'日期表'[年度],
'訂單'[產品名稱],
"銷售額合計",CALCULATE(SUM('訂單'[銷售額]))
)

 

是不是看起來更加簡潔,它的第一個參數不再需要表,而是直接是分組列,實踐上看,它的性能要優於ADDCOLUMNS和SUMMARIZE組合,當然也遠優於SUMMARIZE,生成匯總表時建議直接用SUMMARIZECOLUMNS(關於性能,你可以使用DAX Studio進行測試)。

SUMMARIZECOLUMNS應該就是為了替代SUMMARIZE而出現的,它可以實現SUMMARIZE的功能;SUMMARIZE的內部參數,比如ROLLUPGROUP等,SUMMARIZECOLUMNS同樣也有,並且還有更多其他內部參數可以調用,不過對於普通DAX使用者來說,可能並不會使用到,就不再介紹了,想深入理解的請自行查閱該函數文檔。

總結

    • 提取多列的有效組合時,可以使用SUMMARIZE
    • 返回匯總表時,推薦使用SUMMARIZECOLUMNS

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM