天天看點

SUMMARIZE:值得你花30分鐘來了解的函數!

SUMMARIZE:值得你花30分鐘來了解的函數!

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

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

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

https://docs.microsoft.com/en-us/dax/summarize-function-dax

它的參數非常複雜和難以了解,參數很多,并且有些參數都是可選的、可重複的。直接靠文檔不容易了解,我們可以根據執行個體來了解它的用法。

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

01 | 提取次元表

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

次元表1 = SUMMARIZE('訂單','訂單'[産品名稱])

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

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

次元表2 = SUMMARIZE('訂單','訂單'[産品名稱],'日期表'[年度])
SUMMARIZE:值得你花30分鐘來了解的函數!

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

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

02 | 傳回彙總表

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

彙總表1 =

SUMMARIZE(

    '訂單',

    '日期表'[年度],

    '訂單'[産品名稱],

    "銷售額合計",SUM('訂單'[銷售額])

)

SUMMARIZE:值得你花30分鐘來了解的函數!

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

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

03 | 傳回帶合計的彙總表

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

彙總表2 =

    ROLLUP('日期表'[年度],'訂單'[産品名稱]),

SUMMARIZE:值得你花30分鐘來了解的函數!

看到在彙總表的下面還多了幾行合計數,這就是ROLLUP參數的作用。它隻在SUMMARIZE内部使用,用于為子類别計算小計和總計。

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

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

彙總表3 =

    ROLLUP(ROLLUPGROUP('日期表'[年度],'訂單'[産品名稱])),

SUMMARIZE:值得你花30分鐘來了解的函數!

分組的小計不見了,隻傳回了總計, 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

/推薦閱讀/

繼續閱讀