Power Pivot中“父行彙總百分比”的度量值寫法
轉自微信
本文旨在通過求“父行彙總百分比“的案例,分享Power Pivot建模中遇到問題的解決思路和方法,順便分享幾個篩選函式的不同,包括ALL、ALLSELECTED、ISFILTERED和HASONEFILTER 。
在實際工作中,我們除了展示銷售額數字以外,還經常需要通過百分比進行展現,讓報表的讀者很容易的獲取某個城市的銷售佔比情況。我們可以通過Excel資料透視表的”值顯示方式“ – “總計的百分比“快速得到這樣的顯示結果。
但這種方式只能在資料透視表裡使用,比較侷限。我們不能基於這個佔比進行後續的其它計算。也不能在後續的展現裡使用該佔比,比如Power View 或 Power BI Desktop裡。所以我們需要在Power Pivot模型裡把這個度量值寫出來。
我們先使用All來寫,公式如下:
過使用篩選函式 ALL,我們使分母不受資料透視表裡的篩選上下文影響,結果如下:
難度升級一
公式返回了我們想要的結果。但是此時如果我們通過切片器篩選某個省份,我們看公式的結果:
由於公式裡的ALL 函式對切片器裡的篩選上下文進行了替換,強制返回整張表裡所有的資料,導致無論我們如何篩選,報表裡的百分比都是顯示某個城市佔所有銷售額的佔比。
如果我們希望只顯示所選擇的資料佔比情況,則需要使用另外一個篩選函式ALLSELECTED, 我們新建公式如下:
由於ALLSELECTED只統計所有我們通過切片器選擇的城市資料,可以讓我們實現佔比按照切片器的選擇來顯示。所以這種情況下ALLSELECTED更靈活。
難度升級二
假設此時我們在報表裡使用層級,加入省份資訊,我們看下結果:
對應的佔比資訊我們希望顯示為”父行佔比”。以廣東為例,我們希望廣東下面的廣州和深圳分別顯示銷售額佔廣東省的佔比,而不是全國的佔比。而在省份級別的廣東,我們希望顯示廣東在全國的銷售佔比。
由資料透視表顯示方式生成的“銷售額佔比“,在省份級別是對的,但在城市級別的數字不對。我們可以通過調整顯示方式為”父行彙總百分比“糾正。
對於度量值“ALL” 和“ALLSELECTED”我們需要對公式進行調整,由於ALL不夠靈活,我們在這裡把ALL先刪除。
ALLSELECTED在城市級別是對的,但是在省份級別是錯的。這是由於我們在公式裡使用了“城市“的原因,
我們需要對省份級別使用如下公式:
這就要求我們需要先識別出資料所在的級別。我們需要引入另外一個函式ISFILTERED,通過ISFILTERED 來判斷當前資料所在位置是省份級別還是城市級別。公式如下:
為了方便理解,我們把這兩個度量值新增到透視表裡看下結果:
我們看到,"ISFILTERED省份"在省份級別上是TRUE,說明該行資料被省份篩選。而"ISFILTERED城市"在該行是FALSE,說明改行資料沒有被城市篩選(見上圖中藍色部分)。
而在下面的城市級別,"ISFILTED省份"和"ISFILTED城市"都是TRUE,說明該行資料同時被省份和城市篩選(見上圖中黃色部分)。
基於此,我們對ALLSELECTED公式進行如下調整:
先通過ISFILTERED判斷資料所在的位置,然後進行相應的佔比計算。得到的結果如下:
這就是我們想要的父行彙總的百分比。
難度升級三
假設我們此時使用切片器對城市進行篩選,見下圖,我們選擇唐山,所有資料的顯示都是正確的。
結果在省份級別出錯了。我們知道以這種方式檢視報告的人很少,但為了避免這種變態的場景出現,我們還需要對公式再進行一次調整。
為了排查錯誤,我們再次把“ISFILTERED省份”和“ISFILTERED城市”拿到透視表裡來:
圖中黃色標註部分,當我們選擇跨省份的兩個城市時,會造成ISFILTERED城市在省份級別變成TRUE,所以我們在“ISFILTERED&ALLSELECTED”裡的公式就會錯誤把省份級別資料識別為城市級別,下圖標註處:
為了解決這個問題,我們需要引入另外一個函式HASONEFILTER:
HASONEFILTER可以幫我們界定某個欄位上的直接篩選值是否為一個。在本例中,當用戶選擇唐山和三亞時,“HASONEFILTER城市”可以幫我們判斷此時省份所在行被城市的多個值篩選了(FALSE),見下圖綠色部分:
通過這個判斷,我們可以將公式更改為:
得到最終結果如下(綠色):
而這個結果,無論我們怎麼篩選切片器都是返回正確的“父行彙總百分比”
通過這一系列的更改,我們最終通過HASONEFILTER得到了想要的結果。但需要注意的是這並不代表HASONEFILTER才是最好用的DAX函式,大家應該根據不同需求選擇正確的函式。