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

如何設置Power BI圖表的默認上下文?

AgnesJ

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

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

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

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

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

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

數據樣本:一張銷售表和一張日曆表。

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

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

使用「日曆」[年份]的年份切片器

直方圖顯示每一個「銷售額」[銷售員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) ) )

是不是很簡單呢?嘻嘻。

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

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

依然很簡單,抓住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) ))

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

讓我們來看看效果:

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

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

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

這裡需要藉助兩個中間度量值,來為我們確定是否切片器被篩選。其中一個用來記錄當前切片器的選擇值,我們稱其為[CurrentSelection?]

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

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

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

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

如果 [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 函數分別進行單一切片器初始默認值設置的演示:

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

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

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

更多乾貨,歡迎關注知乎專欄:

Power BI星球?

zhuanlan.zhihu.com
圖標

喜歡了別忘了點個贊哦。

推薦閱讀:

相關文章