在外觀上,PowerPivot與Excel傳統(tǒng)數(shù)據透視表(英文稱作PivotTable)似乎沒什么明顯區(qū)別,甚至連創(chuàng)建過程都基本相似,那為什么你做出來的就是普通的傳統(tǒng)Excel數(shù)據透視表,而我做出來卻是功能強大的PowerPivot超級數(shù)據透視表呢?秘訣就在于“創(chuàng)建數(shù)據透視表”對話框里的一個關鍵設置:將此數(shù)據添加到數(shù)據模型!
我們在創(chuàng)建傳統(tǒng)Excel數(shù)據透視表時,過程是這樣的:選擇數(shù)據源,依次點擊“數(shù)據》插入》數(shù)據透視表”按鈕,會彈出一個“創(chuàng)建數(shù)據透視表”對話框,就是在這個對話框下方,也許你從未留意,有這樣一個設置:“將此數(shù)據添加到數(shù)據模型”。
在默認情況下,這個選項是不被勾選的。在不勾選這個選項的情況下,點擊創(chuàng)建數(shù)據透視表對話框最下方的“確定”按鈕后,生成的Excel數(shù)據透視表就是普通的、功能有限的傳統(tǒng)Excel數(shù)據透視表。而當勾選“將此數(shù)據添加到數(shù)據模型”時,插入到Excel中的數(shù)據透視表就變成了PowerPivot,也就是功能強大的“超級數(shù)據透視表”。
?
盡管在外觀上,超級數(shù)據透視表PowerPivot和傳統(tǒng)Excel數(shù)據透視表并沒有什么明顯的區(qū)別,但是,因為勾選了“將此數(shù)據添加到數(shù)據模型”,PowerPivot將與傳統(tǒng)數(shù)據透視表的內在生成方式上完全不同,兩者的能力也會有天壤之別!
下圖中,PowerPivot值區(qū)域中計算的是圖書銷售冊數(shù)的“非重復計數(shù)”,而非總銷售冊數(shù)的合計。非重復計數(shù)這個功能,在傳統(tǒng)Excel數(shù)據透視表中是沒有的,而“非重復計數(shù)”這個能力,相對于PowerPivot所有能力,只是“小荷才露尖尖角”。
?
回到本節(jié)的主題,為什么當我們勾選了“創(chuàng)建數(shù)據透視表”對話框中的“將此數(shù)據添加到數(shù)據模型”后,會讓數(shù)據透視表忽然具有如此神奇的功能呢?
其實,當你勾選“將此數(shù)據添加到數(shù)據模型”這個選項時,Excel會把數(shù)據源中的數(shù)據先加載到PowerPivot專用數(shù)據庫里,正式因為這個PowerPivot專用的數(shù)據庫,讓我們有機會在數(shù)據最終展示到數(shù)據透視表之前,利用PowerPivot數(shù)據模型管理界面對數(shù)據進行各種自定義的、靈活操作。
要想查看PowerPivot背后的數(shù)據模型(或者說PowerPivot專用數(shù)據庫),請點擊“Power Pivot》數(shù)據模型”按鈕,這時,進入到PowerPivot數(shù)據模型管理界面。
?
注意:如果你的Excel界面上沒有PowerPivot菜單,則需在Excel中做如下設置:點擊Excel“文件》選項》加載項”,在“加載項”對話框下方的“管理”下拉框中選擇“COM加載項”,然后點擊旁邊的“轉到”按鈕,這時,在接下來彈出的“COM加載項”對話框中勾選“Microsoft Power Pivot for Excel”,然后再點擊“確定”按鈕即可。
?
在PowerPivot數(shù)據模型管理界面中,我們看到,該界面分成上中下三部分。最上方是數(shù)據模型管理界面的菜單區(qū),中間部分是我們剛剛導入到模型中的數(shù)據,下方的網格則是DAX數(shù)據分析表達式編輯區(qū),這里也是我們寫入各種超級強大的數(shù)據分析表達式(DAX)的地方。
在PowerPivot數(shù)據模型管理界面左下角,我們看到,我們剛剛導入的表格被PowerPivot數(shù)據模型管理器自動命名為“區(qū)域”,而不是默認使用Excel工作表的名稱,如果不喜歡這個名稱,我們可以右鍵更改它,但在這里,我們使用這個默認表格名稱。
?
在PowerPivot數(shù)據模型管理界面,我們可以對來自數(shù)據源的數(shù)據進行初步的觀察和研究。在分析數(shù)據之前,對數(shù)據進行初步的觀察和研究,這是非常必要的,如果對數(shù)據都不了解,何談分析!
在數(shù)據模型管理界面的數(shù)據表格中,我們可以對數(shù)據進行篩選和增加新列等操作,增加新的列在PowerPivot術語中叫做增加“計算列”。
在下方的DAX表達式編輯區(qū),我們可以把實現(xiàn)各種復雜數(shù)據分析運算的DAX數(shù)據分析表達式寫在里面。PowerPivot數(shù)據模型管理界面相當于PowerPivot數(shù)據模型的控制面板,是我們發(fā)揮聰明才智,調取PowerPivot強大能力的地方。
這里需要提示的是:我們在PowerPivot模型管理界面中的篩選操作的結果并不會傳遞到由此生成的超級數(shù)據透視表中去。PowerPivot模型管理界面中的篩選只是用來觀察后臺數(shù)據和初步調試DAX表達式的地方,PowerPivot模型管理界面里的篩選操作和由此生成的PowerPivot是之間是沒有任何聯(lián)系的。
我們先從一個最簡單的DAX數(shù)據分析表達式開始:我們將利用PowerPivot和DAX數(shù)據分析表達式,實現(xiàn)一個傳統(tǒng)Excel數(shù)據透視表中已有的功能,即利用DAX數(shù)據分析表達式中的SUM()函數(shù)對圖書銷售冊數(shù)進行匯總。
首先,我們創(chuàng)建一個PowerPivot,此刻,別忘了在插入數(shù)據透視表的“創(chuàng)建數(shù)據透視表”對話框中,勾選“將此數(shù)據添加到數(shù)據模型”選項!這是生成PowerPivot的關鍵一步。接下來,點擊“Power Pivot》數(shù)據模型”按鈕,進入PowerPivot的數(shù)據模型管理界面。
在PowerPivot數(shù)據模型管理界面,我們看到,數(shù)據已經加載到了PowerPivot數(shù)據管理模型。這里再強調一下,如果在創(chuàng)建數(shù)據透視表時,你不勾選“將此數(shù)據添加到數(shù)據模型”選項的話,在這里是看不到任何數(shù)據的。
你可能已經注意到,PowerPivot數(shù)據模型里的數(shù)據源表名稱并不是工作表的名稱,而是被自動重新命名為“區(qū)域”,這個名稱可以右鍵點擊名稱標簽自行修改。
PowerPivot數(shù)據模型里的數(shù)據和數(shù)據源是動態(tài)鏈接的,也就是說,如果數(shù)據源中的數(shù)據發(fā)生了變化,我們點擊界面菜單上的“刷新”按鈕,數(shù)據模型界面中的數(shù)據會跟著發(fā)生變化。
下面,我們在PowerPivot數(shù)據模型管理界面下方任意一個網格中輸入如下DAX數(shù)據分析表達式:=SUM('區(qū)域'[T3銷售冊數(shù)])。這里你會發(fā)現(xiàn),當我們輸入“=SUM(”之后的上撇號“’”時,PowerPivot會提示可用的數(shù)據模型中字段名稱,這大大加快了我們鍵入DAX數(shù)據分析表達式的速度,請大家充分利用這個特性。
?
當我們完成公式輸入后,PowerPivot會自動給DAX表達式起一個默認的名字“度量值1”。這里需要大家記?。涸赑owerPivot中,術語上把寫在PowerPivot數(shù)據模型管理界面下方網格中、起到匯總計算作用的DAX數(shù)據分析表達式,叫做“度量值表達式”或者叫做“度量值”。度量值將會放置在PowerPivot超級數(shù)據透視表的值區(qū)域中。
度量值表達式的名稱(即DAX表達式冒號前面的部分),我們可以自行定義,為了容易理解,這里我們把“度量值1”改成“my總冊數(shù)”。
我們看到,這個度量值表達式相當簡單,憑借對Excel工作表函數(shù)的使用經驗,我們推測出公式=SUM('區(qū)域'[T3銷售冊數(shù)])的作用是對數(shù)據源表格中的[T3銷售冊數(shù)]字段進行累加操作。這相當于在數(shù)據透視表中增加了一個新的“值”字段(即可以拖拽到PowerPivot值區(qū)域中的字段)。下面,我們就來看看把這個度量值添加到數(shù)據透視表值區(qū)域中是什么效果。請點擊PowerPivot數(shù)據管理界面菜單中的“數(shù)據透視表”按鈕。
?
現(xiàn)在我們進入了數(shù)據透視表(PowerPivot)界面。在數(shù)據透視表字段布局視圖中拖拽字段,生成下圖所示的數(shù)據透視表。此時,在工作表右側的數(shù)據透視表字段列表中,我們看到了一個新的名稱“my總冊數(shù)”,這個就是我們剛剛在PowerPivot數(shù)據模型管理界面中設計的DAX度量值表達式。該度量值字段現(xiàn)在已經被拖拽到了數(shù)據透視表的值區(qū)域中。
?
我們發(fā)現(xiàn),數(shù)據透視表的值區(qū)域中的數(shù)值和我們直接把數(shù)據源中的字段[T3銷售冊數(shù)]拖拽到數(shù)據透視表值區(qū)域中的默認求和結果一致。
請大家注意,這里雖然只是一個最簡單的PowerPivot度量值表達式,但它留給我們的想象空間卻是巨大的。在傳統(tǒng)Excel數(shù)據透視表中,值區(qū)域中的匯總方式只能在有限的幾種方式中選擇,而有了PowerPivot,我們則可以用DAX數(shù)據分析標大賽中的函數(shù)設計自己的數(shù)據匯總方式!
雖然在這個例子中我們只使用了最簡單的自定的匯總方式SUM(),但事實上,這里的DAX數(shù)據分析表達式可以是其他任何有意義的DAX公式,因此,我們可以通過設計不同的DAX表達式,讓PowerPivot的匯總能力只局限于我們對DAX數(shù)據分析表達式應用的掌握程度!
我們已經介紹過,PowerPivot數(shù)據模型管理界面下方的網格,是添加自定義DAX數(shù)據分析表達式的地方,我們把寫在這里的DAX數(shù)據分析表達式叫做“度量值”。所謂度量值,實際上可以簡單理解為“一種自定義的數(shù)據透視表值區(qū)域匯總方式”。
當PowerPivot的數(shù)據源為單個表格時,DAX度量值表達式可以寫在DAX網格的任意位置,度量值表達式與其所在的行或者列的位置無關,只要度量值引用了數(shù)據源表格中正確的字段即可。
在傳統(tǒng)Excel數(shù)據透視表中,如果數(shù)據源的某個字段是數(shù)字類型,那么當我們把這個字段拖拽到數(shù)據透視表的值區(qū)域時,默認的匯總方式總是求和。在PowerPivot超級數(shù)據透視表中,我們可以設計DAX數(shù)據分析表達式模擬傳統(tǒng)數(shù)據透視表的這個行為,就像剛剛介紹的那個DAX表達式SUM()函數(shù)一樣。
在PowerPivot數(shù)據模型管理界面中,能夠寫入DAX數(shù)據分析表達式的地方有兩個:除了在下方的DAX表達式設計網格中寫入“度量值”公式外;我們還可以在PowerPivot數(shù)據模型管理界面中數(shù)據表格的最右側,增加新的DAX“計算列”公式。
在PowerPivot中,我們把在數(shù)據表中增新加的列叫做“計算列”。計算列字段一般用在PowerPivot數(shù)據透視表篩選環(huán)境字段中(比如行標題、列標題、切片器、篩選字段等)。
下圖中,我們?yōu)閿?shù)據表增加了一個新的計算列,用來生成圖書大類代碼。具體操作方法是,在數(shù)據表最后的空白列中任選一個單元格,鍵入公式:=LEFT('區(qū)域'[T0大類K],1),按下回車鍵便得到了結果。
這里我們看到,這個DAX函數(shù)和Excel工作表函數(shù)名稱和用法基本相同,這是一個好消息。在DAX中,很多簡單函數(shù)與Excel工作表函數(shù)名稱和用法基本相同。
計算列的默認標題一般是“計算列+序號”,為了讓計算列的名字更加友好,我們可以雙擊列名,把默認列名修改為自己喜歡的名字,比如這里,我們把計算列的名稱更改為“大類代碼”。
?
前面介紹了在PowerPivot值區(qū)域中自定義匯總方式的基本方法,即設計DAX度量值公式。接下來,我們將用DAX實現(xiàn)更加靈活的PowerPivot值區(qū)域匯總方式。利用這種方式,我們幾乎可以在PowerPivot值區(qū)域內實現(xiàn)任何復雜的匯總分析!
為實現(xiàn)這個在PowerPivot值區(qū)域中實現(xiàn)任何復雜匯總分析的目的,讓我們隆重介紹一個非常非常(兩個非常)重要的DAX數(shù)據分析表達式函數(shù):CALCULATE()!
我們知道,透視表值區(qū)域每一個單元格中的內容雖然看起來只是一個簡單的數(shù)值,但每一個數(shù)值背后,都對應著一個由該單元格所處的透視表篩選環(huán)境下的數(shù)據源子集,該數(shù)值便是在該數(shù)據源子集的基礎上匯總而來的。
換句話說就是:數(shù)據透視表值區(qū)域中每一個單元格中的數(shù)值,都是由它對應的數(shù)據源子集,經過特定的某種匯總計算的結果。
由此我們推想:如果有一種方法,能根據實際需求,修改透視表值區(qū)域單元格所對應的篩選環(huán)境,從而得到數(shù)據源的任意子集的匯總值,那么,我們還有什么做不到的事情?!沒錯,DAX數(shù)據分析表達式就是來干這個的!而在DAX數(shù)據分析表達式中,最最重要的函數(shù)就是CALCULATE()!
在DAX中,CALCULATE()是一個匯總運算函數(shù),該函數(shù)的特別之處在于,CALCULATE()在執(zhí)行匯總運算之前,不但能夠“識別”其當前所處的透視表篩選環(huán)境,而且,還能對其所處的透視表篩選環(huán)境進行“修改”。
事實上,CALCULATE()的匯總計算是在新的“疊加的透視表篩選環(huán)境下”進行的。該函數(shù)通常使用兩個參數(shù),第一個參數(shù)為“自定義的匯總運算”,第二個參數(shù)為“對當前篩選環(huán)境的修改”,其語法格式為:
=CALCULATE(
自定義的匯總運算,
對當前篩選環(huán)境的修改
)
CALCULATE()函數(shù)的語法看起來似乎并不復雜,但是,這里需要強調重要的一點,那就是CALCUCATE()函數(shù)的內部運算邏輯:
CALCULATE()函數(shù)的內部運算邏輯為:先對當前篩選環(huán)境進行的修改,然后再執(zhí)行自定義的匯總運算。
我們之所以如此強調CALCULATE()函數(shù)的內部運算邏輯,是因為它的內部運算邏輯與參數(shù)的出場順序是相反的!這與我們熟知的Excel工作表函數(shù)的工作方式完全不同,請大家一定留意!
CALCULATE()函數(shù)執(zhí)行計算時,先由第2個參數(shù)開始。在CALCULATE()中,第二個參數(shù)被稱為“篩選器”參數(shù),因為他們的作用是修改CALCULATE()函數(shù)所處的當前篩選環(huán)境;CALCULATE()函數(shù)的第一個參數(shù)被稱為“匯總參數(shù)”,因為第一個參數(shù)的作用是執(zhí)行匯總計算。
在最簡單的CALCULATE()函數(shù)應用中,第2個參數(shù)可以省略。在只有一個匯總參數(shù)的情況下,CALCULATE()函數(shù)將默認接受當前篩選環(huán)境,即,如果CALCULATE()函數(shù)用在數(shù)據透視表值區(qū)域中,則CALCULATE()函數(shù)將在其當前所處的透視表篩選環(huán)境下運算。
讓我們從最簡單的情況開始,研究只有第一個參數(shù)時的CALCULATE()函數(shù)的應用。比如前面介紹的度量值公式:=SUM('區(qū)域'[T3銷售冊數(shù)]),現(xiàn)在,我們在這個度量值公式外面套上一個CALCULATE()函數(shù),并將新的DAX度量值公式命名為“總冊數(shù)CALCU”,如下圖。
?
我們回到數(shù)據透視表界面,把新設計的度量值拖拽到透視表值區(qū)域,得到如下結果。我們看到,以下兩個度量值的計算結果并沒有什么不同。
總冊數(shù)CALCU:=CALCULATE(SUM('區(qū)域'[T3銷售冊數(shù)]))
my總冊數(shù):=SUM('區(qū)域'[T3銷售冊數(shù)])
?
?
以上DAX度量值公式的計算結果之所以完全相同,這是因為在PowerPivot中有這么一個特性:
當一個DAX度量值公式拖入到數(shù)據透視表值區(qū)域時,會隱含地在該度量值公式外面包裹一個看不見的CALCULATE()函數(shù)。
因此度量值表達式:
my總冊數(shù):=SUM('區(qū)域'[T3銷售冊數(shù)])
在被拖入到數(shù)據透視表值區(qū)域中時,隱含地,其公式外面會自動包裹一個CALCULATE()函數(shù),也就是說,上述度量值公式被拖入PowerPivot值區(qū)域時,DAX公式會變成:
my總冊數(shù):=CALCULATE(SUM('區(qū)域'[T3銷售冊數(shù)]))
按照這個規(guī)律,我們剛剛設計的新度量值公式:
總冊數(shù)CALCU:=CALCULATE(SUM('區(qū)域'[T3銷售冊數(shù)]))
在被拖拽到數(shù)據PowerPivot透視表值區(qū)域中時,也會包裹一個CALCULATE()函數(shù),變成:
總冊數(shù)CALCU:=CALCULATE(CALCULATE(SUM('區(qū)域'[T3銷售冊數(shù)])))
其效果相當于只包裹了一個CALCULATE()函數(shù)。因此,這兩個度量值公式得到了同樣的結果。
事實上,CALCULATE()函數(shù)在應用中很少只使用一個參數(shù),因為這并不能發(fā)揮出它最大的運算能力。如果只用一個參數(shù),作為度量值公式,那么還不如不使用這個函數(shù),直接把CALCULATE()函數(shù)的第一個參數(shù)(匯總參數(shù))拖拽到PowerPivot數(shù)據透視表值區(qū)域中更為省事,反正默認地,當DAX度量值公式在拖拽到PowerPivot值區(qū)域時,也會在外面包裹一個CALCULATE()。
本書接下來會頻繁地使用帶有兩個參數(shù)的CALCULATE()函數(shù),正是因為CALCULATE()函數(shù)的第二個參數(shù),也就是所謂的“篩選器參數(shù)”,能夠修改CALCULATE()函數(shù)所處的當前篩選環(huán)境,從而使得CALCULATE()函數(shù)能夠在新的篩選壞境中實現(xiàn)各種靈活的匯總計算。
????