https://zhuanlan.zhihu.com/p/121773967
數據分析就是篩選、分組、聚合的過程,關於篩選,可以按一個維度來篩選,也可以按多個維度篩選,還有種常見的方式是,利用幾個特定的維度值構成的表,作為條件表來篩選原始表。
也就是說,根據一個表,來篩選另外一個表,在PowerBI中怎么做,更具體一點,如何用DAX來完成呢?
假設原始數據記錄為一張模擬的訂單表:
還有一張表,命名為篩選條件表,
根據這個篩選表,來找出訂單表中的記錄,即找出1月2日產品A和B、以及1月3日產品B的銷售記錄。
這個問題相當於求兩個表的交集,很自然的會想到用表函數
NATURALINNERJOIN來實現,直接用這個函數來新建表測試一下,
你會發現沒法正常返回結果,錯誤提示也很清楚,沒有公共聯接列。
所以第一步應該先讓兩個表產生關系,但是兩個表之間只能有一個維度的關系,無法同時在兩個列上建立關系,那篩選條件是兩個維度怎么做呢?
很簡單,通過兩個維度表建立關系就行了,
然后再用NATURALINNERJOIN就可以正常提取出需要的數據了,
如果覺得前兩列是重復的,可以用SELECTCOLUMNS函數來選擇結果表中需要的列。
就這個問題繼續探索一下,如果篩選條件表和訂單表沒有建立關系,是否可以實現呢?
也是可以的,在DAX中還有個強大的函數,TREATAS,專門處理沒有建立關系的情況,因為它可以在表之間構建虛擬關系,直接進行篩選。
可以將上面構建的數據模型中的關系全部刪掉,在沒有任何關系,也沒有維度表,只有篩選條件表和訂單表的情況下,使用TREATAS效果如下:
直接得出想要的結果,是不是很強大。
TREATAS函數在以前的案例中也使用過,但是沒有詳細介紹,其實它並不難理解。
DAX函數名稱大部分都是用英文單詞組合的,TREATAS,是個關系函數,可以理解為TREAT+AS:將xx視同為xx的意思。(具體語法請參考官方文檔)
以上面的篩選為例,
--------TREATAS( '篩選條件表', '訂單表'[訂單日期], '訂單表'[產品名稱])--------
它就是將“篩選條件表”,視同為訂單表中的訂單日期列和產品名稱列,用訂單表中的兩列來篩選訂單表,當然是能返回正確的結果的。
TREATAS很好用,它可以在不破壞原有數據模型的前提下,根據現實的需要,在公式內部靈活的構建虛擬關系,來進行計算。
但它的靈活性也是有代價的,在虛擬關系下運行的速度比實體關系下要慢很多,當數據量較大時會明顯的感覺到。
總結
本文通過一個常見的分析場景,給出兩個解決辦法,並通過這兩種辦法,認識了兩種關系:實體關系和虛擬關系,虛擬關系的篩選是通過TREATAS函數實現的。
不要因為TREATAS可以不建立關系就能實現篩選,你就忽視建模的作用,在數據模型中建立實體關系總是很必要的。上面第一種方式是DAX數據分析的基本功,在此之上,學習更靈活的技巧,不經意間秀一下,更能讓人刮目相看。