![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5iMmN2Y3EmY4MmZ2MGM3QjYzgTNzQGNzIzM5UDMiVDNz8CX0EzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.jpeg)
星友 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 函數。
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 函數分别進行單一切片器初始預設值設定的示範:
今天的分享就到這裡啦,DAX可以實作的可能性真的是太多了,不但許多Power BI本身可以實作的設定都可以被DAX代替,而且DAX還可以實作許多Power BI還未更新的功能呢,這個神仙語言,真的讓我難以自拔啊。
順便說一句,當在切片器中選擇“全選”選項時,上文提到的方法都将不起作用。原因?這還用問嘛?
感謝AgnesJ分享的實用技巧,熟練使用DAX,可以幫助我們更靈活的控制圖表,也歡迎更多的小夥伴分享自己的訣竅哦。