天天看點

利用DAX的CALCULATE和COUNTROWS比較兩列值是否相同

在利用Power BI進行資料整理時,某些情況下會需要比較來自不同表單中的兩列值是否相同。例如在下例中需要比較一下Sales-1和Sales-2兩張表中的Customer Number是否有相同值。

利用DAX的CALCULATE和COUNTROWS比較兩列值是否相同

要解決該問題可以利用DAX的CALCULATE和COUNTROWS函數進行。可以在Sales-2的表單中建立一個計算列,比較一下Sales-1和Sales-2中的Customer Number值,如果Sales-2中的Customer Number在Sales-1中也存在,就标記為TRUE,如果沒有就标記為FALSE。使用公式如下:

Matched = CALCULATE(COUNTROWS('Sales-1'),FILTER('Sales-1','Sales-1'[Customer number]='Sales-2'[Customer number]))>
           
利用DAX的CALCULATE和COUNTROWS比較兩列值是否相同

這個公式當中調用CALCULATE函數的目的是需要對資料進行重新篩選,以便比較兩個列當中是否有相同值。這個篩選條件是在FILTER函數中進行定義的,過濾對象是Sales-1表單,過濾條件是’Sales-1’[Customer number]=’Sales-2’[Customer number]。過濾之後的新Sales-1表單,會被帶入到COUNTROWS中進行計算,看看一共有多少行,之後再與0進行比較。大于0就表明兩個表單有相同資料,小于等于0則沒有。

在Filter函數中具體的執行過程是,基于計算列的特性,将目前表Sales-2中的Customer number一個一個拿出來去Sales-1表單中去跟Customer number列作比對,當有相同值時,目前行就會被取出用于構成新的表單,如果沒有比對值,會傳回空值(blank)。對于Countrows函數來說,當傳入的資料是空值時,計算傳回結果也是空值。而根據DAX對空值的處理邏輯,此處會将空值按照數字0進行計算,是以通過簡單的與0做比較即可判斷兩組資料是否比對。

按照這一思路,如果要比較目前Sales-2表中的Sales ID和Customer number兩列資料與相對應的Sales-1表是否相同,也比較簡單。可以在Filter函數中調用If函數做一個簡單的判斷處理。

MatchedTwoColumn- = CALCULATE(COUNTROWS('Sales-1'),FILTER('Sales-1',IF('Sales-1'[Customer number]='Sales-2'[Customer number],IF('Sales-1'[Sale ID]='Sales-2'[Sale ID],TRUE()))))>
           
利用DAX的CALCULATE和COUNTROWS比較兩列值是否相同

當然,如果覺得用If嵌套麻煩也可以改成用Switch重寫一下。

MatchedTwoColumn- = CALCULATE(COUNTROWS('Sales-1'),FILTER('Sales-1',SWITCH('Sales-1'[Customer number]='Sales-2'[Customer number]&&'Sales-1'[Sale ID]='Sales-2'[Sale ID],TRUE(),TRUE())))>
           

此外,如果要比較的兩列可以形成1對多的關聯關系,還可以利用之前blog介紹的Relationship函數來判斷兩列的相同值有哪些。

繼續閱讀