[Microsoft-SSAS] MDX Basic
我最近報名了Azure Fundamental的微軟課程,因為算是未來工作可能會使用的雲端服務,但因為是邊辦公邊聽的,沒有辦法即時吸收,但它還有贈送免費的AZ-900測驗,無論如何,這陣子就想辦法來考上它吧!
這篇準備內容寫得很好~~
https://medium.com/blacksecurity/az-900-microsoft-azure-fundamentals-d0718175de65
回到正題,上周說MDX會有些類似線性代數的概念,今天來繼續介紹這些基本概念,今天的內容可能會有點長喔,但觀念有了我覺得日後建立cube會輕鬆一些。
•Tuples
- Cells
- Sets
MDX都由上述三種集合構成的,Tuple原文的意思代表Cube中任一個可識別的位置,在二維度空間就是一個座標點,三維就是一個空間中的點,而tuple代表多維度空間中的一個座標點。
譬如這樣的一個資料定義,就是代表在Adventure Works這個cube中,各個維度軸所表示出來後的位置。

Cell的中文叫做細胞,在cube中叫做資料格,原文: A cube is composed of cells, organized by measure groups and dimensions. A cell represents the unique logical intersection in a cube of one member from every dimension in the cube. 代表它需要被定義清楚,否則可能讓cube的組成出問題。
所謂的定義清楚,是因為我們在看cube(也就是拉pivot table)時,各種維度組合的可能都會有,但是有些組合之下aggregate出來的value其實是無意義的,所以我們在定義cell時候都給予其properties上的設定,限制一些維度組合,讓使用者使用時出來的數字結果呈現上可以更合理,更準確看到需要的資料。
至於Sets它就是tuple的組合,原文: Using collections of tuples, known as sets, to retrieve multiple cells,譬如下面這樣的資料category欄位的名稱集合就是Sets,在cube使用上它也會有一些hierarchy上的限制,否則也會讓結果呈現出現奇怪的現象。

譬如下面右下角這樣的Sets,將不同層級的產品欄位同時呈現在一個維度上,就是不合理的呈現,所以這樣子query必定是跑不出結果的..

像這樣就是正確的query了,結果就會出現像excel樞紐那樣的資料囉!

另外,不同維度排列順序上也有規定,下圖左方也是錯誤的呈現,因為國家和年度是需要並排呈現的,所以年度出現幾次,國家欄位就要出現幾次,不過這種寫法會讓欄位撰寫重複,因此其實可以直接用corss join的寫法,接著會再稍微介紹。

上面三個概念,是組成cube的基本元素,都是很基本的概念喔! 我們也知道,cube是由很多個維度和measurements組成的資料,我們分析時候通常用到五六個就蠻多了,系統上是可以承受到128個維度,真的非常多,但也要看RAM和CPU是否能負擔這麼大就是了…欄和列其實也只是其中二種表現的方式,真正使用上還更多進階的技巧。

最後的最後,再來介紹一下基本的cube使用常用的函數
Cross Join
剛才說到,維度如果寫到二個其實二者欄位值的順序需要互相配合,但如果自已寫出所有的排列組合也未免太累了,所以我們可以用cross join的方式,把要使用的維度用set的方式組合就可以了,寫法分Crossjoin和*兩種,分別如下面二張圖:


Calculated member
這是在cube上建置欄位的技巧,更常用在開發cube上面,使用者query時候也可以使用,就跟我們在SQL時候寫select…from中間自己加工的欄位一樣的意思喔!下面是一個範例建置一個X=1+1的欄位

Non Empty Function
這個函數通常用在cross join後其實有些組合出來是沒有對應結果的,這時候可以直接忽略不呈現的意思,這種做法可以大大減少呈現出來的data size,增進很大的效能。

資料來源:
SQL server 2008 OLAP多維度分析 悅知文化 尹相志 著 Ch11~13
Ssas mdx language
https://www.slideshare.net/VinodWilson/ssas-mdx-language?from_action=save