在2019年3月1日,在SqlBits大會(huì)上,微軟宣布DAX引入一項(xiàng)重大更新:Calculation Group(暫且不做翻譯)。這項(xiàng)更新將對(duì)PowerBI及SSAS均構(gòu)成重要影響。為此,微軟SSAS團(tuán)隊(duì)官方,SQLBI.com以及Chris Webb分別在各自博客記錄這一內(nèi)容。(后兩者為SSAS領(lǐng)域國(guó)際頂級(jí)專家博客)
按照 SSAS 團(tuán)隊(duì)官方的話說(shuō),這是一項(xiàng)DAX本該具有卻一致未有的能力。
按照 馬克·啰嗦 大師的說(shuō)法,之所以《DAX圣經(jīng) 第二版》一直未出版,就是在等微軟宣布這項(xiàng)DAX更新,這將寫入最后一章。
按照 Chris Webb 的觀點(diǎn),這項(xiàng)更新是DAX歷史上最重要的更新。
那么到底是什么功能(特性),另各位專家如此興奮不已呢,本文將結(jié)合三方博客來(lái)介紹這一特性。
問(wèn)題背景
簡(jiǎn)單直接地說(shuō),這個(gè)問(wèn)題來(lái)自于 DAX度量值 的復(fù)用問(wèn)題,舉例如下:
現(xiàn)有度量值:訂單銷售額,訂單利潤(rùn),訂單利潤(rùn)率等10個(gè)指標(biāo),它們的計(jì)算邏輯非常簡(jiǎn)單。不妨稱之為基礎(chǔ)度量值。
當(dāng)我們需要這些基礎(chǔ)度量值與一些條件關(guān)聯(lián)時(shí),就會(huì)產(chǎn)生新的度量值,如和時(shí)間有關(guān)的組合,包括:
MTD,QTD,YTD,PY,MTD PY,QTD PY,YTD PY,PY FY,MTD YOY%,QTD YOY%,YTD YOY%等很容易就超過(guò)10個(gè),因此,對(duì)于10個(gè)基礎(chǔ)度量值,每個(gè)基礎(chǔ)度量值都會(huì)與10個(gè)條件組合來(lái)派生度量值,迅速多達(dá)100個(gè)度量值。
而如果有50個(gè)度量值與20個(gè)條件來(lái)組合,就會(huì)達(dá)到1000個(gè)度量值,我們稱之為無(wú)法復(fù)用導(dǎo)致的度量值爆炸式增長(zhǎng)。
在微軟的產(chǎn)品中,其實(shí)有一條隱形的準(zhǔn)則,那就是:如果用戶在有規(guī)律地重復(fù)一項(xiàng)操作,那么有兩個(gè)可能:要么有一個(gè)一鍵解決的方法,只是你不知道;要么就是微軟缺乏了一項(xiàng)重要的特性。而99%的可能性是前者。 也就是用戶不知道這個(gè)一鍵搞定的方法,例如:數(shù)據(jù)模型自動(dòng)檢測(cè)是對(duì)N次VLOOKUP的一鍵解決方案。
順便提一句:VLOOKUP 在辦公中將兩個(gè)表合并為一個(gè)表,再透視基本是辦公階段Excel用法的鐵律,而在BI中,直接建立數(shù)據(jù)模型的方法直接將辦公的用法完全碾壓,辦公需要VLOOKUP,而BI卻是一鍵解決的,因此花費(fèi)大量精力去搞清楚VLOOKUP的十大技巧完全不必。
而在今天這里,卻是后者,確實(shí)是微軟缺失了一項(xiàng)在 DAX 中解決復(fù)用問(wèn)題的特性。再重復(fù)一次:如何在DAX中復(fù)用復(fù)雜邏輯,不需要編寫新的度量值,卻可以從基本度量值派生新的度量值。
Calculation Group
為了解決類似上述的問(wèn)題,現(xiàn)有的DAX是無(wú)法做到的(當(dāng)然,現(xiàn)在可以了)。微軟稱這項(xiàng)特性叫:Calculation Group。這一個(gè)只含有一列的表,列中的每個(gè)值定義了可復(fù)用的計(jì)算邏輯,稱這些值叫:calculation items。
這里不做中文翻譯,因?yàn)樵撎匦陨性陬A(yù)覽階段,以未來(lái)微軟提供的中文翻譯名字為準(zhǔn)。
calculation items 可以與度量值任意結(jié)合使用,達(dá)到改變度量值已有邏輯,更準(zhǔn)確講,是從已有邏輯派生新計(jì)算邏輯。
一個(gè)典型的案例就是將時(shí)間維度的邏輯進(jìn)行復(fù)用,形如:

時(shí)間維度案例
表名稱:Time Inteligence
列名稱:Time Calculation
優(yōu)先級(jí):20
對(duì)其中 calculation item 的定義如下:

可以看到,這里用到了 SELECTEDMEASURE 函數(shù),請(qǐng)仔細(xì)觀察上述的效果示意圖,可以看出:當(dāng) calculation item 與 度量值 在一起使用時(shí),它可以動(dòng)態(tài)的修改度量值。準(zhǔn)確地猜測(cè)(微軟尚未發(fā)布官方說(shuō)明),calculation item 將動(dòng)態(tài)地修改度量值進(jìn)行計(jì)算的篩選上下文環(huán)境,而不去管這個(gè)度量值是什么。
從 CALCULATE 的技術(shù)細(xì)節(jié)來(lái)講,應(yīng)該是在 CALCULATE 計(jì)算的上下文堆棧中,壓入新的篩選器,再計(jì)算 CALCULATE 的第一個(gè)參數(shù)。(詳細(xì)原理已經(jīng)在Excel120的《DAX基礎(chǔ)》中給出,不再贅述。)這里很明顯會(huì)涉及到三個(gè)問(wèn)題:
如何選出當(dāng)前的度量值:SELECTEDMEASURE。
當(dāng)前度量值的名字:SELECTEDMEASURENAME。
是否是特定的度量值:ISSELECTEDMEASURE。
上述三個(gè)新增函數(shù)就可以來(lái)解決這個(gè)問(wèn)題。
還有一個(gè)問(wèn)題就是如果一個(gè)基礎(chǔ)度量值與多個(gè)calculation item同時(shí)使用,到底哪個(gè) calculation item 先算的問(wèn)題,這個(gè)由上述的優(yōu)先級(jí)定義給出。
相關(guān)信息
該DAX能力目前僅僅在預(yù)覽階段的 SQL Server 2019 CTP 2.3 中存在,而且尚無(wú)任何微軟官方編輯器可以編輯操作該特性,也就是說(shuō),你無(wú)法在 DAX Studio,Power BI Desktop 或 SSAS 的 SSDT 中操作或設(shè)置該特性。
該特性已經(jīng)在 引擎版本1470中存在。目前我們使用的 2019年2月 版的PowerBI 引擎版本為 1465。如下:

也就是說(shuō),本文所述的特性目前看不見,摸不著,但它的確存在于最新的DAX引擎中了。
這是一個(gè)使用起來(lái)很簡(jiǎn)單的特性,但SSAS團(tuán)隊(duì)需要在背后做很多事情,才能確保該特性與其他DAX特性完好共存,例如:Excel是可以作為客戶端來(lái)使用的;RLS的兼容;動(dòng)態(tài)格式字符串;AllSELECTED等函數(shù);Detail Rows 表達(dá)式等。
動(dòng)態(tài)格式字符串
你可以想象對(duì)于一個(gè)基礎(chǔ)度量值(如:銷售額)與N個(gè) calculation item 的結(jié)合使用,會(huì)產(chǎn)生 去年銷售額 以及 銷售額增長(zhǎng)率 這兩個(gè)不同指標(biāo),而它們一個(gè)是數(shù)字格式,一個(gè)是百分比格式,但卻只有一個(gè)基礎(chǔ)度量值,這便構(gòu)成了一個(gè)矛盾。
在 超級(jí)復(fù)雜中國(guó)式復(fù)雜報(bào)表 中,我們給出了現(xiàn)有 PowerBI DAX 下的解決方案,但那并非一種原生特性,而是需要利用多種技巧。很明顯,動(dòng)態(tài)格式字符串的發(fā)布將更好的解決這類問(wèn)題,以及更容易地創(chuàng)建中國(guó)式復(fù)雜報(bào)表。
動(dòng)態(tài)格式字符串 特性應(yīng)該會(huì)在2019的迭代中發(fā)布,我們將持續(xù)關(guān)注。
提前嘗鮮
如果特別希望提前體驗(yàn) calculation group 特性,確實(shí)有一個(gè)方法,那就是使用:Tabular Editor。這是一個(gè)由社區(qū)開發(fā)的第三方工具。

給出嘗試思路如下:
- 下載最新版 SQL Server 2019 CTP 2.3 并建立一個(gè) SSAS Tabular 項(xiàng)目。正如上所述,目前微軟尚未提供任何一種可以體驗(yàn) calculation group 特性的編輯工具。
- 使用 Tabular Editor 來(lái)打開上述項(xiàng)目模型文件,通過(guò) Tabular Editor 的能力來(lái)創(chuàng)建 calculation group。
- 部署發(fā)布項(xiàng)目。
- PowerBI Desktop live connenction 模式連接SSAS體驗(yàn)。

按照意大利大師的話來(lái)說(shuō),由于Calculation Group特性的到來(lái),即將解鎖一大波DAX的新能力,具體能做到哪些,現(xiàn)在不好說(shuō),微軟還沒(méi)有對(duì)外明確公布在 Power BI 中發(fā)布該特性的時(shí)間,大師們表示需要數(shù)月甚至整年時(shí)間來(lái)研究由此帶來(lái)的新玩法。
而在微軟的官方博客已經(jīng)能預(yù)料到由于DAX引擎一波特性的發(fā)布,已經(jīng)讓SSAS團(tuán)隊(duì)處于很大負(fù)荷的狀態(tài)。這些特性包括:管理聚合(多對(duì)多);PowerBI 增量刷新;開放 PowerBI 可作為 SSAS 連接,以及今天提及的Calculation Group。
總之,盡情享用吧。
參考資料
微軟SSAS團(tuán)隊(duì)博客:
https://blogs.msdn.microsoft.com/analysisservices/2019/03/01/whats-new-for-sql-server-2019-analysis-services-ctp-2-3/
SQLBI博客:
https://www.sqlbi.com/blog/marco/2019/03/01/calculation-groups-in-dax-first-impressions/
Chris Webb博客:
https://blog.crossjoin.co.uk/2019/03/01/ssas-tabular-2019-calculation-groups-and-migration-from-ssas-multidimensional/