DAX 語法
本文說明 DAX 公式表達式語言的語法和需求。
語法需求
DAX 公式一律以等號開頭(=
)。 等號之後,您可以提供任何會評估為純量的運算式,或任何可轉換為純量的運算式。 其中包括下列各項:
使用純量運算子的純量常數或表示式 (
+,-,*,/,>=,...,&&, ...
)欄或表的參考。 DAX 語言一律使用數據表和數據行做為函式的輸入,絕不會使用數位或任意值集。
表達式中提供的運算子、常數和值。
函式及其必要自變數的結果。 有些 DAX 函式會傳回數據表而不是純量,而且必須包裝在評估數據表並傳回純量的函式中;除非數據表是單一數據行、單一數據列數據表,否則它會被視為純量值。
大部分 DAX 函式都需要一或多個自變數,這些自變數可以包含數據表、數據行、表達式和值。 不過,某些函式,例如 PI,不需要任何自變數,但一律需要括號來指出 null 自變數。 例如,您必須一律輸入 PI(),而不是 PI。 您也可以在其他函式內巢狀處理函式。
運算式。 表達式可以包含下列任何或所有項目:運算子、常數或數據行的參考。
例如,以下是所有有效的公式。
公式 | 結果 |
---|---|
= 3 |
3 |
= "Sales" |
Sales |
= 'Sales'[Amount] |
如果您在 Sales 資料表內使用此公式,將會取得目前數據列之 Sales 數據表中 Amount 資料行的值。 |
= (0.03 *[Amount]) =0.03 * [Amount] |
目前表格中 Amount 資料行的值的百分之三。 雖然此公式可以用來計算百分比,但除非您在數據表中套用格式設定,否則結果不會顯示為百分比。 |
= PI() |
常數pi的值。 |
公式的行為會根據公式的使用方式而有所不同。 您必須隨時注意環境或背景,以及您在公式中使用的數據與可能用於計算的其他數據之間的關係。
命名需求
數據模型通常包含多個數據表。 數據表及其數據行一起組成儲存在記憶體內部分析引擎 (VertiPaq) 中的資料庫。 在該資料庫中,所有數據表都必須有唯一的名稱。 資料行名稱在每份資料表中也必須是唯一的。 所有物件名稱 不區分大小寫;例如,SALES 和 Sales 將指向相同的資料表。
您加入至現有數據模型的每個資料行和量值都必須屬於特定數據表。 當您在資料表內建立計算欄時,或在建立度量值時明確指定度量值定義應儲存在哪個資料表中,您可以指定包含資料行的資料表。
當您使用數據表或數據行作為函式的輸入時,通常必須 符合數據行名稱 資格。 資料行的「完整」名稱是資料表名稱,後面加上以方括弧括住的資料行名稱:例如,'U.S.Sales'[Products]。 當您參考下列內容中的資料行時,一律需要完整名稱:
作為函式的參數,
VALUES
作為函式的參數,
ALL
或ALLEXCEPT
在函式的篩選引數中,
CALCULATE
或CALCULATETABLE
作為函式的參數,
RELATEDTABLE
作為任何時間智慧函式的參數
「不完整的」資料行名稱是只以方括弧括住的資料行名稱,例如 [Sales Amount]。 例如,當您從當前數據表的同一行參考純量值時,您可以使用未限定的欄名稱。
如果數據表的名稱包含空格、保留關鍵詞或不允許的字元,您必須以單引弧括住數據表名稱。 如果名稱包含 ANSI 英數位元範圍以外的任何字元,則不論您的地區設定是否支援字元集,您也必須以引號括住數據表名稱。 例如,如果您開啟的活頁簿包含以 Cyrillic 字元撰寫的數據表名稱,例如 'Таблица',則數據表名稱必須以引號括住,即使它不包含空格也一樣。
注意
為輕鬆地輸入資料行的完整名稱,請使用公式編輯器中的 [自動完成] 功能。
資料表
只要資料行來自目前資料表以外的其他資料表,就一定要有資料表名稱。 資料表名稱在資料庫內必須是唯一的。
如果數據表名稱包含空格、其他特殊字元或任何非英文英數位元,則必須以單引號括住。
量值
量值名稱必須一律以方括弧括住。
量值名稱可以包含空格。
每個量值名稱在模型內都必須是唯一的。 因此,參考現有量值時,數據表名稱在量值名稱前面是選擇性的。 不過,當您建立量值時,必須一律指定將儲存量值定義的數據表。
資料行
資料行名稱在資料表內容中必須是唯一的,但多份資料表可有同名的資料行 (以資料表名稱去除混淆)。
一般而言,您可以參考欄位,而不需要參考其所屬的基表,除非需要解決名稱衝突或某些函式需要欄位名稱的完整限定。
保留關鍵字
如果您用於數據表的名稱與 Analysis Services 保留關鍵詞相同,就會引發錯誤,而且您必須重新命名數據表。 不過,如果物件名稱是以方括號(適用於數據行)或引號(數據表)括住,則可以在物件名稱中使用關鍵詞。
注意
視應用程式而定,引號可由數個不同的字元表示。 如果您從外部檔或網頁貼上公式,請務必檢查用於開啟和結尾引號之字元的 ASCII 程式代碼,以確保它們相同。 否則 DAX 可能無法將符號辨識為引號,使參考無效。
特殊字元
下列字元和字元類型在資料表、資料行或量值的名稱中無效:
前置或尾端空格;除非空格是以名稱分隔符、方括弧或單一單引號括住。
控制字元
下列在物件名稱中無效的字元:
.,;':/\\*|?&%$!+=()[]{}<>
物件名稱範例
下表示範一些物件名稱的範例:
物件類型 | 範例 | 註解 |
---|---|---|
資料表名稱 | Sales | 如果數據表名稱不包含空格或其他特殊字元,則名稱不需要以引號括住。 |
資料表名稱 | 'Canada Sales' | 如果名稱包含空格、索引標籤或其他特殊字元,請以單引號括住名稱。 |
完整的資料行名稱 | Sales[Amount] | 數據表名稱在數據行名稱前面,而數據行名稱會以方括弧括住。 |
完整量值名稱 | Sales[Profit] | 數據表名稱在量值名稱前面,而量值名稱會以方括弧括住。 某些內容一律需要完整名稱。 |
不完整的資料行名稱 | [Amount] | 不完整名稱是只以方括弧括住的資料行名稱。 您可以在相同的表格中的計算欄位中使用未限定名稱的公式,或者在相同表格上進行掃描的聚合函數中使用。 |
包含空格的資料表完整資料行 | 'Canada Sales'[Qty] | 數據表名稱包含空格,因此必須以單引弧括住。 |
其他限制
每個函式所需的語法,以及它可以執行的作業類型,會根據函式而有很大的差異。 不過,一般而言,下列規則適用於所有公式和表示式:
DAX 公式和表示式無法修改或插入數據表中的個別值。
您無法使用 DAX建立計算列。 您只能建立計算欄和度量值。
在定義計算結果欄時,您可以將函式巢狀處理到任何層級。
DAX 有數個傳回數據表的函式。 一般而言,您可以使用這些函式傳回的值做為其他函式的輸入,這需要數據表做為輸入。
DAX 運算子和常數
下表列出 DAX支援的運算子。 如需個別運算符語法的詳細資訊,請參閱
運算子類型 | 符號和使用 |
---|---|
括弧運算子 |
() 參數的優先順序和群組 |
算術運算子 |
+ (加法)- (減法)* (乘法)/ (部門)^ (指數運算) |
比較運算子 |
= (等於)> (大於)< (小於)>= (大於或等於)<= (小於或等於)<> (不等於) |
文字串連運算子 |
& (串連) |
邏輯運算子 |
&& (和)|| (或) |
資料類型
您不需要轉型、轉換或以其他方式指定在 DAX 公式中使用的欄位或值的資料類型。 當您在 DAX 公式中使用數據時,DAX 會自動識別所參考數據行和您輸入之值的數據類型,並在必要時執行隱含轉換來完成指定的作業。
例如,如果您嘗試將數字加入日期值,引擎會在函式的內容中解譯作業,並將數字轉換成共同的數據類型,然後以預期格式呈現日期的結果。
然而,對於某些值能夠成功轉換是有一些限制的。 如果值或數據行具有與目前作業不相容的數據類型,DAX 會傳回錯誤。 此外,DAX 不提供可讓您明確變更、轉換或轉型已匯入數據模型中現有數據類型的功能。
重要
DAX 不支援使用 variant 數據類型。 因此,當您將數據載入或匯入數據模型時,預期每個數據行中的數據通常是一致的數據類型。
某些函式會傳回純量值,包括字串,而其他函式則使用數位、整數和實數,或日期和時間。 每個函式所需的資料類型會在 區段中描述,DAX 函式。
您可以使用包含多個資料列和多個資料列的數據表作為函式的自變數。 某些函式也會傳回儲存在記憶體中的數據表,並可作為其他函式的自變數。
日期和時間
DAX 使用 Microsoft sql Server 所使用的 datetime 資料類型來儲存日期和時間值。 Datetime 格式會使用浮點數,其中 Date 值會對應至整數部分,代表自 1899 年 12 月 30 日以來的天數。 時間值會對應至日期值的十進位部分,其中小時、分鐘和秒是由一天的十進位分數表示。 DAX 日期和時間函式會隱含地將自變數轉換成 datetime 數據類型。
注意
DAX 支援的最大 DateTime 值是 9999 年 12 月 31 日 00:00:00。
日期和時間常值
從 2021 年 8 月版本的 Power BI Desktop 開始,DAX 日期和日期時間值可以指定為常量,格式為 dt"YYYY-MM-DD"
、dt"YYYY-MM-DDThh:mm:ss"
或 dt"YYYY-MM-DD hh:mm:ss"
。 當指定為常值時,不需要在表達式中使用 DATE、TIME、DATEVALUE、TIMEVALUE 函式。
例如,下列表達式會使用 DATE 和 TIME 函式來篩選 OrderDate:
EVALUATE
FILTER (
FactInternetSales,
[OrderDate] > (DATE(2015,1,9) + TIME(2,30,0)) &&[OrderDate] < (DATE(2015,12,31) + TIME(11,59,59))
)
您可以將相同的篩選表示式指定為字面值:
EVALUATE
FILTER (
FactInternetSales,
[OrderDate] > dt"2015-1-9T02:30:00" && [OrderDate] < dt"2015-12-31T11:59:59"
)
注意
Excel 中所有版本的 Power BI Desktop、Analysis Services 和 Power Pivot 都不支援 DAX 日期時間類型的常值格式。 新的和更新的 DAX 功能通常會先在 Power BI Desktop 中引進,然後稍後包含在 Analysis Services 和 Excel 中的 Power Pivot 中。