https://zhuanlan.zhihu.com/p/64421003
學習 DAX 的過程中,會遇到各種坑,剛開始甚至無法寫出一個正確的度量值,總是提示錯誤。其實很多原因都是不理解 DAX 函數及其參數規范造成的,在該用表的時候沒有用表,該用列的時候沒有用列。
常見的 DAX 函數返回一個值,比如 SUM、MAX 等,稱為值函數,這些和 Excel 公式有很多相似之處,很容易理解;難以理解的是和Excel公式不同的地方:DAX 中還有很多表函數。
表函數就是返回的是一張表,如果我們用這種函數建立度量值或者新建列時,很可能會報錯,比如很常見的函數 FILTER,可以作為值函數的參數存在,它無法獨立建立度量值,因為FILTER函數返回的就是一張表,可以在 PowerBI 中測試一下,點擊新表,輸入,
= FILTER('訂單','訂單'[產品名稱]="U盤")
返回的是所有U盤的銷售訂單表。
用這個表達式無法建立度量值,只有再把這個表進行聚合才可以,比如在剛才的表達式外面再套一個 COUNTROWS,計算該表的行數,就可用於度量值,這個度量值的含義是統計U盤的訂單數量。
在 PowerBI 中使用 DAX 的是這三個地方,新建度量值、新建列和新表,
其中前兩個都是需要返回的是一個值,如果用返回表的表達式來創建,將會出現錯誤提示,而新表是利用DAX創建一個表,它使用的就是返回表的表達式。
哪些函數返回值,哪些函數返回表
常見的值函數就是聚合函數,比如常用到的 SUM、COUNTROWS、AVERAGE,以及CALCULATE、SUMX等;
表函數也經常用到,除了上面看到的 FILTER,ALL 也是個表函數,前面的文章中使用過的還有 VALUES、DISTINCT、UNION、ADDCOLUMNS、SELECTCOLUMNS 等;
哪些函數的參數是列,哪些函數的參數是表
值函數返回的雖然是一個值,但其參數可能需要一張表,比如 SUMX,它的第一個參數就是一張表。
表函數返回的是表,但是參數也有可能需要的是列,比如 VALUES,它的參數是一列,返回的該列的不重復值,只有一列的表。
有些表函數的參數,既可以是值、也可以是表,比如 ALL 函數,正如前面看到的,既可以寫 ALL('產品表'),也可以寫成 ALL('產品表'[產品名稱]),只是代表的意義是不同的。
如果某函數的參數是列,我們只能把某個表的列作為參數,而不能是整個表。如果參數是表,而我們要處理的列,怎么辦?其中一種方式就是用VALUES 把列轉化為表,然后作為參數。
另外 VALUES 函數雖然返回的是表,不過它返回的是只有一列的表,如果這個表僅有一行,那么它同時也是值,在 DAX 中,只有一行一列的表,就是個值,所以 VALUES 在某些情況下也可以用於度量值的創建,在使用DAX時會經常用到這個特性。
通過上面的介紹,基本就知道了很多 DAX 函數報錯的原因,使用DAX函數時,一定要做到心中有數,該用表的時候用表,該用值的時候用值,那么如何掌握這些呢,這里推薦學習DAX的最佳網站:https://dax.guide
DAX GUIDE
這是 DAX 世界級大神9月份剛推出的一個簡潔實用的學習網站,收錄了所有的DAX函數,如果有新的 DAX 發布,它也會同步更新。
左側是 DAX 函數的列表,點擊就可以看到該函數的含義及各種使用特性,比如ALL函數,
上圖中只是標記了參數的類型和返回的類型,實際上該網站的其他標記也非常重要,有的甚至還列出了使用方式和示例,特別有助於理解使用。
當然你也看到了,這是個全英文的網站,如果英文水平不是太好,推薦用Chrome 瀏覽器,可以直接翻譯網頁。