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