數(shù)據(jù)類型DAX 可以使用七種常用的數(shù)據(jù)類型進行計算。在下面的列表中,我們展示了同一種數(shù)據(jù)類型在 DAX 種的名稱和它更常見的名稱。例如,布爾值(Boolean values)在 DAX 術語中被稱為 TRUE/FALSE。我們更愿意遵循事實上的命名標準,將它們稱為布爾值。除此之外,還有兩種比較特殊的類型會在最后介紹
DAX 有一個強大的類型處理系統(tǒng),因此你不必擔心數(shù)據(jù)類型:當你編寫 DAX 表達式時,結果的類型基于表達式使用的術語類型自動調整。我們稱之為隱式轉換,但在某些情況下,它不會進行轉換。 例如,如果 DAX 函數(shù)需要日期數(shù)據(jù)類型,而你的列的數(shù)據(jù)類型為文本,DAX 函數(shù)將不能正常工作。 因此,獲取適用于列的正確數(shù)據(jù)類型是重要并且有用的,如果 DAX 表達式返回的類型不是預期的類型,你需要須檢查表達式使用的術語的數(shù)據(jù)類型。
例如,如果某列的數(shù)據(jù)類型是日期,那么求和的結果也是日期;然而,如果對整數(shù)使用相同的運算符,則結果是整數(shù)。這就是運算符重載,你可以在下圖中看到它的行為示例,其中 OrderDatePlusOneWeek 列是通過在 Order Date 列的值上增加 7 來計算的。結果,就像我們說的,是一個日期。 除了運算符重載之外,在需要時 DAX 還會自動將字符串轉換為數(shù)字,或者將數(shù)字轉換為字符串。例如,如果使用連接字符串的&運算符,DAX 將把它的參數(shù)轉換成字符串。例如:
將返回字符串形式的“54”,另一公式
返回數(shù)值型結果 9 結果值依賴于運算符,而不是引用的列,列根據(jù)運算符的要求進行轉換。即使這種行為看起來很方便,稍后你將看到在這些自動轉換期間可能發(fā)生哪些錯誤。我們建議避免自動轉換。如果需要進行某種轉換,那么最好主動介入并使用顯示轉換。比如上面的例子應該使用:
熟悉 Excel 或其他語言的人可能更熟悉 DAX 數(shù)據(jù)類型。你可以在這里找到關于 DAX 數(shù)據(jù)類型的規(guī)范。然而,對于每一種數(shù)據(jù)類型介紹一些注意事項是很有必要的。 整數(shù) (Integer)DAX 只有一個整數(shù)數(shù)據(jù)類型,存儲 64 位的整數(shù)。DAX 中的整數(shù)值之間的所有內部計算都使用 64 位整數(shù)。 它支持 19 位數(shù);從 -9,223,372,036,854,775,807 (-2^63+1) 到 9,223,372,036,854,775,806 (2^63-2) 的正數(shù)或負數(shù)。 在需要控制舍入的情況下,整數(shù)類型非常有用。 Power BI Desktop 數(shù)據(jù)模型支持 64 位整數(shù)值,但由于存在 JavaScript 限制,因此視覺對象可安全表達的最大數(shù)字是 9,007,199,254,740,991 (2^53-1)。 如果在數(shù)據(jù)模型中使用大于以上值的數(shù)字,可在將該數(shù)字添加到視覺對象前,通過計算減小其大小
十進制數(shù)(Float)十進制數(shù)總是以雙精度浮點值的形式存儲。不要將這種 DAX 數(shù)據(jù)類型與 Transact-SQL 的十進制和數(shù)字數(shù)據(jù)類型混淆:在 SQL 中,DAX 十進制數(shù)字的對應數(shù)據(jù)類型是浮點。 貨幣(Currency)貨幣數(shù)據(jù)類型存儲固定的十進制數(shù)。它可以表示為 4 位的小數(shù),內部存儲為 64 位的整數(shù)值除以 10000。在貨幣數(shù)據(jù)類型之間執(zhí)行的所有計算總是忽略 4 位小數(shù)點后面的小數(shù)。如果需要更精確的數(shù)據(jù),則必須進行十進制數(shù)據(jù)類型的轉換。 貨幣數(shù)據(jù)類型的默認格式包括貨幣符號。還可以將貨幣格式應用于整數(shù)和十進制數(shù),還可以使用一種不帶貨幣符號的格式來表示貨幣數(shù)據(jù)類型。 當表達式包含不同數(shù)據(jù)類型之間的乘法和除法時,需要關注是否涉及貨幣數(shù)據(jù)類型。因為在計算中進行類型轉換的位置不同可能會產(chǎn)生不同的結果。貨幣數(shù)據(jù)類型對于避免聚合中的某些舍入錯誤非常重要,但是應該謹慎地管理它,以避免復雜表達式產(chǎn)生意外的舍入錯誤。
日期/時間(Datetime)DAX 在日期/時間數(shù)據(jù)類型中存儲日期。這種格式內部使用浮點數(shù),其中整數(shù)對應于 1899 年 12 月 30 日以來的天數(shù),而小數(shù)部分則表示當天的份數(shù)。小時、分鐘和秒被轉換成一天的小數(shù)部分。因此,下面的表達式返回當前日期加上一天(正好是 24 小時):
它的結果是在計算當前時間的明天的日期,如果你只需要使用日期/時間的日期部分,可以使用 TRUNC 函數(shù)來刪除小數(shù)部分。 Power BI 還提供另外兩種數(shù)據(jù)類型:日期類型和時間類型。在引擎內部,它們是日期/時間的簡單變體。實際上,兩種類型分別只存儲日期/時間的整數(shù)部分或小數(shù)部分。 閏年錯誤1983 年發(fā)布的流行電子表格程序 Lotus 1-2-3 在處理 DateTime 數(shù)據(jù)類型時出現(xiàn)了一個錯誤。它認為 1900 年是閏年,盡管事實并非如此(一個世紀的最后一年是閏年,前提是前兩位數(shù)字除以 4 沒有余數(shù))。當時,Excel 第一版的開發(fā)團隊故意復制了這個 bug,以保持與 Lotus 1-2-3 的兼容性。從那以后,出于兼容性考慮,Excel 的每一個新版本都把這個 bug 作為一個特性來維護。 為了保持與 Excel 的向后兼容,目前這個 bug 仍然在 DAX 中。Bug 的存在(或者我們應該稱之為特性嗎?)可能會導致 1900 年 3 月 1 日之前出現(xiàn)錯誤。因此,根據(jù)設計,DAX 的第一個官方支持的日期是 1900 年 3 月 1 日。在此日期之前執(zhí)行的日期計算可能會導致錯誤,應該被認為是不準確的。 DAX 中的 1 代表 1899 年 12 月 31 日,而 EXCEL 是 1900 年 1 月 1 日,存在這種差別的原因是 Lotus 1-2-3 的最初版本有一個 bug,認為 1900 是一個閏年,其中包括 1900 年 2 月 29 日。實際上 1900 年不是閏年,所以在 1900 年 3 月 2 日之前的日期在 Lotus 1-2-3 中被誤寫了。由于蓮花的電子表格在當時非常受歡迎,為了與其競爭,微軟在自家的 EXCEL 上繼承了這個 bug 以便用戶可以無縫切換。DAX 的開發(fā)者對這個 Bug 采用了另一種不同的實現(xiàn)方式,導致在這個特定的時間段內,DAX 與 Excel 存在 1 天的差距。 如果你需要在 1900 年之前進行計算,你應該使用數(shù)學方法來將其移動到 1900 年之后的日期,執(zhí)行計算,然后再平移回去。 布爾值(TRUE/FALSE)布爾數(shù)據(jù)類型用于表示邏輯條件。例如,由以下表達式定義的計算列類型為布爾型:
你也可以將布爾數(shù)據(jù)類型視為數(shù)字,其中 TRUE=1 和 FALSE=0。這在排序時很有用,因為 TRUE >FALSE。相反的,如果在邏輯判斷中直接使用數(shù)字,那么 0 將會被視為 FALSE,例如下面的表達式始終返回空
文本(String)DAX 中的每個字符串都存儲為 16 位 Unicode 字符串。默認情況下,字符串之間的比較是不區(qū)分大小寫的,因此這兩個字符串“PowerPivot”和“POWERPIVOT”是相等的。 PowerQuery 比較字符串時默認區(qū)分大小寫,這是兩者的一個不同點,需特別留意。如果你使用的是 Analysis Services 表格模型,可以自行設置是否區(qū)分大小寫
二進制(Binary)二進制數(shù)據(jù)類型用于在數(shù)據(jù)模型中存儲圖像,在 DAX 中無法訪問該數(shù)據(jù)類型。它主要被 Power View 或其他客戶端工具用來顯示直接存儲在數(shù)據(jù)模型中的圖片。在 Power BI 等其他工具中可能無法使用 在圣經(jīng)第一版中此處使用的格式類型是二進制大對象(BLOB)
空白/Null 類型BLANK 不對應 SQL 中的 NULL。DAX 中的 BLANK 不遵循 NULL 在 SQL 中的計算邏輯。在中間結果可能是 BLANK 的表達式中,必須注意這種區(qū)別。 你可以使用 BLANK 函數(shù)創(chuàng)建空白,并使用 ISBLANK 對其進行測試。 關于空白、空字符串和零值的處理:
關于 BLANK 的更多注意事項,請在閱讀BLANK 的函數(shù)介紹。 變體/Variant 類型變體數(shù)據(jù)類型用于可能返回不同數(shù)據(jù)類型的度量值,具體取決于度量值使用的條件表達式。例如,下面的語句可以返回整數(shù)或字符串,所以它返回一個變體類型:
DAX 運算符了解了運算符在確定表達式類型的重要性之后,我們通過下表來看一下 DAX 中的運算符列表。 運算符列表
注意:IN 運算符 2016 年 11 月發(fā)布,可能無法在 Excel 2016 以及更早的版本中使用,詳情參考IN 和 CONTAINSROW一文。 此外,邏輯運算符也可以作為 DAX 函數(shù)使用,語法非常類似于 Excel。例如,你可以這樣寫:
它們分別與下面的寫法等價:
當你必須編寫復雜條件時,使用函數(shù)代替運算符進行布爾邏輯運算變得非常有用。事實上,當需要格式化大量代碼時,函數(shù)比運算符更容易格式化和讀取。然而,函數(shù)的主要缺點是一次只能傳入兩個參數(shù)。如果需要計算兩個以上的條件,就需要嵌套函數(shù)。 嚴格相等運算當兩個參數(shù)的值相同或都為空時,操作符==返回 TRUE,此運算符不執(zhí)行字符串和數(shù)字之間的任何隱式轉換,也就是說,將空值(BLANK)與任何其他值比較,比如 0、空字符串等,都將返回 FALSE。 只有當兩個術語中至少有一個為空、空字符串或 0 時,==運算才與=不同。以下是使用“嚴格等于”運算符的有效表達式:
嚴格相等運算(==)在 Power BI, Azure Analysis Services, and Analysis Services 2019 中可用,但不支持早期的 Analysis Services 和 Power Pivot for Excel.
|
|
來自: 優(yōu)雅野人 > 《二 dax基礎知識》