天天看點

如何設定Power BI圖表的預設值?

如何設定Power BI圖表的預設值?

星友 AgnesJ 分享的 PowerBI 小技巧,在存在外部切片器的情況下,如何設定圖表的預設值呢,下面直接進入正文。

如何設定Power BI圖表的預設值?

AgnesJ

Power BI 裡經常用到切片器,但切片器設定裡并不能直接設定預設初始值,比如要實作每次打開Power BI時,在切片器沒發生篩選的情況下,讓圖表自動顯示最近一天,該怎麼設定呢?

想要實作Power BI 視圖都能預設顯示最近一個月的銷售額,要怎麼做呢?

最近在做一份2010年到2019年的銷售記錄報表時,遇到了這個問題。客戶要求一打開報表,所有與切片器連接配接的視圖都預設顯示目前年度的銷售額,也就是說,我需要對我的日期切片器設定一個預設初始值:目前年份。

預設值 = 切片器中沒有選擇時所取的值,一旦切片器中有任何一個選擇,預設值就應該消失。如果切片器中沒有選擇,則切片器所取的列上沒有過濾器直接作用,這使我立即想到ISFILTERED函數。

ISFILTERED  直接過濾columnName時傳回TRUE  。如果列上沒有過濾器,或者由于正在過濾同一表或相關表中的不同列而發生過濾,則該函數傳回  FALSE。

下面,我會用由兩個表組成的簡單模型給大家做一個示範。

資料樣本:一張銷售表和一張月曆表。

資料來源 :微軟提供樣本資料庫的AdventureWorks2012

如何設定Power BI圖表的預設值?

報表内容:一個切片器用于篩選年份,一個直方圖包含總銷售額關于銷售員ID的配置設定情況。

如何設定Power BI圖表的預設值?

使用“月曆”[年份]的年份切片器

直方圖顯示每一個“銷售額”[銷售員ID]的[總銷售額]

現在,我們要確定當切片器沒有被篩選時,直方圖将顯示2014年的總銷售額情況,也就是說如果“月曆”[年份]沒有被過濾,銷售總額将會是2014年的銷售總額。

思路一旦出來,DAX語句也就很好寫出來了:

Total sales with Default2 = IF ( ISFILTERED(Calender[Year]), SUM ('Sales SalesOrderHeader'[SubTotal]), CALCULATE ( SUM ( 'Sales SalesOrderHeader'[SubTotal] ), FILTER('Calender',Calender[Year]=2014)    )  )

是不是很簡單呢?嘻嘻。

那麼,如果某個視圖連接配接了多個切片器,該怎麼辦?比如下面這種情況:

三個切片器:'月曆'[年] /'月曆'[月] /'月曆'[日期],任意一個切片器或組合都可以對視圖進行篩選。

如何設定Power BI圖表的預設值?

依然很簡單,抓住ISFILTERED再找 OR 來幫個忙就好啦!

建立一個路徑成本[IsAnySlicerFiltered?],當這三個切片器中沒有任何選擇時,誰将傳回False,并且當有任意一個切片器被篩選時将傳回True。

IsAnySlicerSelected? = OR( OR( ISFILTERED(Calender[Date]),ISFILTERED(Calender[Month])), ISFILTERED(Calender[Year]) )

現在,隻需要用ISFILTERED(Calender [Year])替換[IsAnySlicerFiltered?] ,就可以實作我們的目标了。

Total sales with Default 3 = IF ( [IsAnySlicerSelected?], SUM ('Sales SalesOrderHeader'[SubTotal]), CALCULATE ( SUM ( 'Sales SalesOrderHeader'[SubTotal] ), FILTER('Calender',Calender[Year]=2014) ))

這就搞定一個視圖連結多個切片器的情況咯!

讓我們來看看效果:

如何設定Power BI圖表的預設值?

但DAX的功能那麼豐富,用ISFILTRED 函數絕對不是唯一解決方案,比如,我們可以換一種思路來定義切片器的預設初始值:

預設初始值 = 切片器沒有進行選擇= 切片器所屬列被篩選的行數為0,也就是說我們可以用計行數來解決,COUNTROWS 一下。

如果被篩選的行數是預設值( Power BI會預設全選 ),那麼結果就為初始預設值,否則預設值就失效。

這裡需要借助兩個中間路徑成本,來為我們确定是否切片器被篩選。其中一個用來記錄目前切片器的選擇值,我們稱其為[CurrentSelection?]

CurrenctSelection? = COUNTROWS(DISTINCT(ALLSELECTED(Calender[Year])))

另外一個為切片器所包含列的所有可能性,[TotalSelection?]。

TotalSelection? = COUNTROWS(DISTINCT(ALL(Calender[Year])))

這裡用到了DAX家族裡功能十分強大的ALL 函數 和ALLSELECTED 函數。

Et voilà,如果 [CurrentSelection?] = [TotalSelection?],那麼我們就需要展示切片器的預設初始值。

Total sales with Default = IF ( [CurrenctSelection?] = [TotalSelection?], CALCULATE ( SUM ( 'Sales SalesOrderHeader'[SubTotal] ), FILTER('Calender',Calender[Year]=2014) ), SUM ('Sales SalesOrderHeader'[SubTotal]))

下面為,使用ISFILTERED 以及 ALL 函數和ALLSELECTED 函數分别進行單一切片器初始預設值設定的示範:

如何設定Power BI圖表的預設值?

今天的分享就到這裡啦,DAX可以實作的可能性真的是太多了,不但許多Power BI本身可以實作的設定都可以被DAX代替,而且DAX還可以實作許多Power BI還未更新的功能呢,這個神仙語言,真的讓我難以自拔啊。

順便說一句,當在切片器中選擇“全選”選項時,上文提到的方法都将不起作用。原因?這還用問嘛?

感謝AgnesJ分享的實用技巧,熟練使用DAX,可以幫助我們更靈活的控制圖表,也歡迎更多的小夥伴分享自己的訣竅哦。