數(shù)據(jù)分析就是篩選、分組、聚合的過程,關(guān)于篩選,可以按一個維度來篩選,也可以按多個維度篩選,還有種常見的方式是,利用幾個特定的維度值構(gòu)成的表,作為條件表來篩選原始表。
也就是說,根據(jù)一個表,來篩選另外一個表,在PowerBI中怎么做,更具體一點(diǎn),如何用DAX來完成呢?
假設(shè)原始數(shù)據(jù)記錄為一張模擬的訂單表:

還有一張表,命名為篩選條件表,

根據(jù)這個篩選表,來找出訂單表中的記錄,即找出1月2日產(chǎn)品A和B、以及1月3日產(chǎn)品B的銷售記錄。
這個問題相當(dāng)于求兩個表的交集,很自然的會想到用表函數(shù)
NATURALINNERJOIN來實(shí)現(xiàn),直接用這個函數(shù)來新建表測試一下,

你會發(fā)現(xiàn)沒法正常返回結(jié)果,錯誤提示也很清楚,沒有公共聯(lián)接列。
所以第一步應(yīng)該先讓兩個表產(chǎn)生關(guān)系,但是兩個表之間只能有一個維度的關(guān)系,無法同時在兩個列上建立關(guān)系,那篩選條件是兩個維度怎么做呢?
很簡單,通過兩個維度表建立關(guān)系就行了,

然后再用NATURALINNERJOIN就可以正常提取出需要的數(shù)據(jù)了,

如果覺得前兩列是重復(fù)的,可以用SELECTCOLUMNS函數(shù)來選擇結(jié)果表中需要的列。
就這個問題繼續(xù)探索一下,如果篩選條件表和訂單表沒有建立關(guān)系,是否可以實(shí)現(xiàn)呢?
也是可以的,在DAX中還有個強(qiáng)大的函數(shù),TREATAS,專門處理沒有建立關(guān)系的情況,因?yàn)樗梢栽诒碇g構(gòu)建虛擬關(guān)系,直接進(jìn)行篩選。
可以將上面構(gòu)建的數(shù)據(jù)模型中的關(guān)系全部刪掉,在沒有任何關(guān)系,也沒有維度表,只有篩選條件表和訂單表的情況下,使用TREATAS效果如下:

直接得出想要的結(jié)果,是不是很強(qiáng)大。
TREATAS函數(shù)在以前的案例中也使用過,但是沒有詳細(xì)介紹,其實(shí)它并不難理解。
DAX函數(shù)名稱大部分都是用英文單詞組合的,TREATAS,是個關(guān)系函數(shù),可以理解為TREAT+AS:將xx視同為xx的意思。(具體語法請參考官方文檔)
以上面的篩選為例,
--------
TREATAS(
'篩選條件表',
'訂單表'[訂單日期],
'訂單表'[產(chǎn)品名稱]
)
--------
它就是將“篩選條件表”,視同為訂單表中的訂單日期列和產(chǎn)品名稱列,用訂單表中的兩列來篩選訂單表,當(dāng)然是能返回正確的結(jié)果的。
TREATAS很好用,它可以在不破壞原有數(shù)據(jù)模型的前提下,根據(jù)現(xiàn)實(shí)的需要,在公式內(nèi)部靈活的構(gòu)建虛擬關(guān)系,來進(jìn)行計(jì)算。
但它的靈活性也是有代價的,在虛擬關(guān)系下運(yùn)行的速度比實(shí)體關(guān)系下要慢很多,當(dāng)數(shù)據(jù)量較大時會明顯的感覺到。
總結(jié)
本文通過一個常見的分析場景,給出兩個解決辦法,并通過這兩種辦法,認(rèn)識了兩種關(guān)系:實(shí)體關(guān)系和虛擬關(guān)系,虛擬關(guān)系的篩選是通過TREATAS函數(shù)實(shí)現(xiàn)的。
不要因?yàn)門REATAS可以不建立關(guān)系就能實(shí)現(xiàn)篩選,你就忽視建模的作用,在數(shù)據(jù)模型中建立實(shí)體關(guān)系總是很必要的。上面第一種方式是DAX數(shù)據(jù)分析的基本功,在此之上,學(xué)習(xí)更靈活的技巧,不經(jīng)意間秀一下,更能讓人刮目相看。








暫無數(shù)據(jù)