PowerBI DAX 重構系列:用1個度量值代替100個 實現 動態多維度動態演算法動態總計(上篇)

  • 2019 年 10 月 6 日
  • 筆記

概述

《PowerBI 重構》系列(代指:Power BI DAX 重構系列)將是一系列新的話題,旨在將PowerBI 技藝提升到更高的階段。該階段需要堅實的DAX基礎,這些基礎內容已經在其他文章討論過並提供了達成方法。

如果你用過PowerBI DAX就知道寫100個度量值是什麼感受,今天來看一個非常落地的案例並展示如何對這樣的問題進行重構

重構,簡單講就是看原來的不順眼,然後重新做一遍比上一次更好的。當積累的大量經驗以後,就會考慮在第一次設計的時候為未來留下可以擴展的機會。這嚴格遵循抽象設計的 DRY原則(Don』t Repeat Youself) 以及 OCP原則(Open Close Principle),這些內容已在《用戶自動運營分析》中講過,不再重複。

背景問題

先看一個背景問題,要求從三大方面按某時間區間(如:今年)分析銷售額大小,銷售額排名以及銷售額佔比:

  • 從 產品類別 方面
  • 從 城市 方面
  • 從 產品子類別 方面

另外,必須考慮:

  • 考慮到總計行的處理
  • 總計行可以按全局All或用戶所選all

總計行的重要性

可以看出,Power BI自帶的總計效果是遠遠不夠的。在業務分析通常需要將局部發展態勢與全局發展態勢做對比,總計就是全局發展態勢。

到底什麼算「全部」

在理性的領域,一切內容都是精確的,因此可以被預測和控制,這裡當然不例外。全部(ALL),這個詞將在各位的PowerBI旅途中成為一頭攔路虎(不是 路虎,是 攔路虎),要清楚的區分某些場景,全部的語義到底是什麼。(這通常與企業的實際業務密不可分,而且敏感性極高,需要業務專家協同)

例如,我們刻意從上述場景來進行說明: 1、在 按產品類別 分析 銷售額增長率全部 指的是 絕對大全局(對,就是不受影響的總全局),因此我們需要用DAX ALL函數。 2、在 按產品子類別 分析 銷售額增長率全部 指的是 用戶所選擇的全部子類別(以用戶的每次選擇作為全部),因此我們需要用DAX ALLSELECTED函數。

ALLSELECTED 函數作為DAX函數中最複雜的一個,對,你沒看錯,是最複雜的,沒有之一,複雜度超過CALCULATE,但是用起來感覺不到,此處只是指出,但不展開,當然在這裡的案例也遇不到這種複雜。

好的,按類別的分析所用的度量值如下:

其中的ALL體現了絕對全局之意。

這已經有了,現在來寫按類別的分析所用的度量值如下:

其中的ALLSELECTED體現了用戶所選之意。

問題來了,當你問業務專家說,這裡的全部到底是什麼,最可怕的回答來了:都有可能的。然後,業務專家還要補一句:可不可以讓用戶來選擇。對於打造豪華PowerBI報告的設計師當然不能回答不可以,必須回答:可以的。(PowerBI的限制只在於PowerBI的絕對物理限制,甚至要靠想像力和創造力來超過微軟現在尚未提供的)PowerBI設計師會繼續和業務專家確認諸如除非用戶顯式指定,否則默認按全局總計(即ALL)的方式來處理。

於是,5分鐘後,給業務專家看到這樣的效果:

(DAX 計算公式稍後給出)

由於用戶選擇了按全局總計,可以看到結果是正確的。這樣的按鈕式切片器非常強大,它可以讓用戶在實際使用時做出動態的選擇。

至此,通過重構,我們已經有了可以動態選擇總計方式的總計行。

重複的夢魘

在上述總計行的問題中,解決之後,新的問題來了,我們要對:

  • 從 產品類別 方面
  • 從 城市 方面
  • 從 產品子類別 方面
  • 從 … 方面

針對 [銷售額同比增長率] 至少要寫多少個度量值?

DAX公式數 = 可能的維度數 × 可能的度量值數 × 總計方式(2個)

以 5 個維度以及 10 個度量值來看,一共就要寫 100 個DAX公式了。

可以慢慢寫DAX公式了,由於所有的邏輯基本一致,只是在判斷總計的位置有區別:

SELECTEDVALUE( 『產品』[類別] ) = 「總計」 SELECTEDVALUE( 『產品』[子類別] ) = 「總計」

大家可以通過下載示例文件自行思考。這裡的實現將在下篇詳細展開。

總結

模式,是可以重複使用的套路。在這裡我們給出三個模式:

  • 總計行模式(已討論)
  • 演算法選擇模式(已討論)
  • 維度擴展模式(待續)

以上為非正式名稱,未來可能會重新命名以形成一套系列。

在演算法選擇模式的按何種演算法計算總計的DAX公式如下:

號稱用1個度量值處理100個度量值的方式我們留在下篇。