預算模式----DAX學習筆記
做銷售預算,至少得從數據資料庫抽取三張表,時間表,銷售表,產品表,外加企業規划出的一張產品銷售預算表.如圖所示:



銷售總額:=SUM([銷售金額])
接下來使用ISFILTERED函數解決預算總額與銷售總額在時間單位上不統一的問題.也就是當返回數據透視表時,假如存在時間上預算與實際銷售顆粒度不統一時,返回TRUE,單位統一時返回FALSE.以此做為後面IF語句的分支,構造一個複雜公式用來解決時間顆粒度不同時,做正確的預算分配.因此是一個過度型的度量公式.公式如下:
預算粒度:=ISFILTERED(日曆表[Date])||ISFILTERED(日曆表[月份])||ISFILTERED(日曆表[季度])
ISFILTERED按官方解釋 ISFILTERED=(<columnname>),當指定列上有直接篩選器時返回true
這個解釋很抽像,難以理解.對於DAX模型來說,構造一組公式類似於暗箱操作,有時很難弄懂公式背後的數據運作機制,不知道自己寫的公式是不是返回了自己所需要的數據,因此最好的辦法就是放到數據透視表中或是返回鏈接表中觀察.
構造一個相對簡單的公式用來觀察ISFILTERED函數的運算機制:度量值 1:=ISFILTERED(數據源[產品])
拖放進數據透視表中進行觀察:


接著往下,由於已經構造了一個過度用度量值:預算粒度.利用其返回true或false的特性構造if分支語句.返回false,也就是顆粒度統一時,則預算度量將返回預算總額。如果返回true,顆粒度不同時,則必須使用分配演算法計算預算,這取決於公司實際需求.在此示例中,您為該年度的每個工作日分配相同的預算。每年,您可以計算當前過濾器的工作日與當年的總工作日之間的比率。SUMX函數在所選擇的年份中迭代,並且每年使用模擬年度粒度關係的FILTER來檢索相應的預算。公式如下:
預算總額:=IF([預算粒度],
SUMX(VALUES(日曆表[年份]),
CALCULATE(COUNTROWS(日曆表),
日曆表[工作日]=TRUE)/CALCULATE(COUNTROWS(日曆 表),ALLEXCEPT(日曆表,日曆表[年份]),日曆表[工作 日]=TRUE)*CALCULATE(SUM(預算表[預算金 額]),FILTER(ALL(預算表[年份]),預算表[年份]=日曆表[年 份]))
),
SUM(預算表[預算金額]))
在這裡需要說明一下ALLEXCEPT函數,由於使用的少,也許不少人比較陌生,如果是ALL函數,相信學習DAX的童鞋中很多人都熟悉,刪除一切篩選帶來的影響,ALLEXCEPT函數在這裡的意思,除了日曆表中的年份欄位可能會受到篩選器的影響,除此之外,整個表所有欄位都不受篩選器的影響.
差異額無非是預算總額與銷售總額之間的比例.使用DIVIDE函數,避免除以0的情況.差異額:=DIVIDE([銷售總額]-[預算總額],[預算總額])
返回數據透視表,現在可以觀察為每個季度每個月甚至於每個工作日月所做的預算KPI.

請注意列區域一定得使用產品表中產品欄位,其它表中的產品欄位是無效的,因為產品表處於兩個事實表中的一端,而篩選上下文能夠自動從一端向兩個多端傳遞(也就是兩個事實表中傳遞關係).
只要您想將預算分配到不同的粒度,您就可以使用這種技術。如果分配中涉及更多的表,則需要使用更複雜的模式.
用例
您可以使用預算模式,只要您擁有一個粒度數據的表,並且您希望根據滿足業務需求的分配演算法將數字分配到不同的粒度。
固定分配預算
如果您想將每年預算平均分配到每月預算中,則使用固定分配。例如,您將年值除以12以獲取月度值,或者將年值除以365(或閏年的366),然後將結果乘以每月的天數。在這兩種情況下,您都有一個確定性的分配,僅依賴於日曆。
基於歷史數據的預算分配
您可能希望使用歷史數據將預算分配給不能作為預算級別使用的屬性。例如,如果您有按產品類別定義的預算,則可以根據產品的銷售額與上一年的相應產品類別之間的銷售額進行分配。您可以同時分配多個屬性的預算,例如,也可以在日期的基礎上獲得基於先前銷售額的季節性分配。
完整模式下所需要的表:


數據模型包含與日期,區域和產品表關係的銷售表。如圖5所示,預算表沒有任何物理關係,即使它與日曆表中(月度級別)和產品表中(類別級別)具有邏輯關係。(雖然預算表中的類別與產品表中的類別具有邏輯關係,但兩列都存在重複行,所以建立不了物理關係,只有通過filter ,values建立虛擬的關係)



訂單總量:=SUM([訂單數量])
對於預算表中的預計銷售總量的計算分配和基本模式相同,在和訂單總量處於顆粒度相同時,設置一組公式,顆粒度不相同時又是另一組具有複雜分配方案的公式,只是比基本模式要涉及的表要多.
預算有效:=COUNTROWS(銷售表)=CALCULATE(COUNTROWS(銷售表),
ALL(銷售表),
VALUES(日期表[月份]),
VALUES(產品表[類別]))

預算計算:=CALCULATE(SUM(預算表[預算]),
FILTER(ALL(預算表[年份月份]),
CONTAINS(VALUES(日期表[年份月份]),
日期表[年份月份],
預算表[年份月份])),
FILTER(ALL(預算表[類別]),
CONTAINS(VALUES(產品表[類別]),
產品表[類別],
預算表[類別])))

訂單總量YOY:=CALCULATE([訂單總量],SAMEPERIODLASTYEAR(日期表[日期]))
再接著往下構造如下公式
分配比率過渡:=[訂單總量YOY]/CALCULATE([訂單總量YOY],ALLEXCEPT(產品表,產品表[類別]),ALL(日期表[日期]),VALUES(日期表[年份月份]),ALL(地域表))

現在有了預算計算與分配比率過渡兩個度量公式,就可以定義當預算有效返回false時的預算分配方案.公式如下
粒度不同預算分配方案:=SUMX(CROSSJOIN(VALUES(日期表[年份月份]),VALUES(產品表[類別])),[分配比率過渡]*[預算計算])
CROSSJOIN是一個表格型函數.結果返回出一個笛卡爾積的交叉表,也就是表格與表格之間的乘積.語法:CROSSJOIN(<表格1>,<表格2>,<表格3>.....)
需要注意的是<表格>參數中的列名在所有表中都必須是不同的,否則返回錯誤,公式無效.
對於ROSSJOIN(VALUES(日期表[年份月份]),VALUES(產品表[類別]))在這裡產生的一個新表格或許會覺得很難理解.可以返回到逆向鏈接表中觀察.

最終的預算分配方案於是可以用一個簡單的IF語句就可以完成,當返回TRUE時,顆粒度相同時,通常預算的規劃在時間上比較粗,在年份這個匯總層面與銷售表中的銷售是相同的,而再往下細分配到月份,星期天,每天,一般就返回false了.
預算分配:=IF([預算有效],[預算計算],[粒度不同預算分配方案])
預算與銷售數量的差異率
差異率:=DIVIDE([訂單總量]-[預算分配],[預算分配])
所有公式完成,只需要差異率,預算分配,銷售總量三個度量值,其它都可以隱藏,返回到數據透視表,就可以進行不同的數據切片.從不同角度調查自己所需要的數據.



如需下載文件請到QQ交流群553270834
帥的人都關注了EasyCharts團隊^..^~
QQ交流群:553270834
微信公眾號:EasyCharts
更多信息敬請查看: http://easychart.github.io/post/Easycharts/
推薦閱讀:
※一張柱形圖表示實際、半年度及年度預算完成情況
※你不曾知道的Excel條件格式秘密
※這八個excel小技巧,也許是你準時下班的必殺技。
※秘籍帖丨Excel 中的「凌波微步」
TAG:MicrosoftExcel |
