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 英數字元範圍以外的任何字元,則不論地區設定是否支援該字元集,您也必須使用引號括住資料表名稱。 例如,如果您開啟的活頁簿包含以斯拉夫文字元 (例如 ‘Таблица’) 所撰寫資料表名稱,則此資料表名稱即使不包含空格,也必須括在引號中。
注意
為輕鬆地輸入資料行的完整名稱,請使用公式編輯器中的 [自動完成] 功能。
資料表
只要資料行來自目前資料表以外的其他資料表,就一定要有資料表名稱。 資料表名稱在資料庫內必須是唯一的。
如果資料表名稱包含空格、其他特殊字元或任何非英文的英數位元,則必須使用單引號括住。
量值
量值名稱必須一律以方括弧括住。
量值名稱可以包含空格。
每個量值名稱在模型內都必須是唯一的。 因此,參考現有量值時,量值名稱前面的資料表名稱可有可無。 不過,當您建立量值時,則一律必須指定將儲存量值定義的資料表。
資料行
資料行名稱在資料表內容中必須是唯一的,但多份資料表可有同名的資料行 (以資料表名稱去除混淆)。
一般而言,除非需要解決名稱衝突,或某些函式需要完整的資料行名稱,否則參考資料行時不用參考其所屬的基底資料表。
保留關鍵字
如果您使用的資料表名稱與 Analysis Services 的保留關鍵字相同,即會引發錯誤,且必須重新命名該資料表。 不過,如果物件名稱以方括弧 (適用於資料行) 或引號 (適用於資料表) 括住,您就可以在物件名稱中使用關鍵字。
注意
視應用程式而定,引號可由數個不同的字元表示。 如果貼上外部文件或網頁的公式,請務必檢查左右引號所用字元的 ASCII 碼,確保它們是相同的。 否則,DAX 可能無法將符號識別為引號,因此參考無效。
特殊字元
下列字元和字元類型在資料表、資料行或量值名稱中無效:
開頭或尾端空格;除非以名稱分隔符號、方括弧或單一單引號括住空格。
控制字元
下列字元在物件名稱中無效:
.,;':/\*|?&%$!+=()[]{}<>
物件名稱範例
下表示範一些物件名稱的範例:
物件類型 | 範例 | 註解 |
---|---|---|
資料表名稱 | Sales | 如果資料表名稱不包含空格或其他特殊字元,即不需要使用引號括住名稱。 |
資料表名稱 | 'Canada Sales' | 如果名稱包含空格、定位字元或其他特殊字元,請使用單引號括住名稱。 |
完整的資料行名稱 | Sales[Amount] | 資料表名稱在資料行名稱之前,且資料行名稱會以方括弧括住。 |
完整的量值名稱 | Sales[Profit] | 資料表名稱在量值名稱之前,且量值名稱會以方括弧括住。 某些內容一律需要完整名稱。 |
不完整的資料行名稱 | [Amount] | 不完整名稱是只以方括弧括住的資料行名稱。 您可使用的不完整名稱內容,包括相同資料表內計算結果欄中的公式,或用以掃描相同資料表的彙總函式中公式。 |
包含空格的資料表完整資料行 | 'Canada Sales'[Qty] | 資料表名稱包含空格,所以必須使用單引號括住。 |
其他限制
每個函式所需語法及其可執行的作業類型會因函式而有大幅差異。 但一般而言,下列規則適用於所有公式和運算式:
DAX 公式和運算式無法在資料表中修改或插入個別值。
您無法使用 DAX 建立計算結果列。 您只能建立計算結果欄和量值。
在定義計算結果欄時,您可以將函式巢狀處理到任何層級。
DAX 有數個函式會傳回資料表。 這些函式所傳回值一般會作為其他函式的輸入使用,而這些值需要有資料表可輸入。
DAX 運算子和常數
下表列出 DAX 支援的運算子。 如需個別運算子語法的詳細資訊,請參閱 DAX 運算子。
運算子類型 | 符號和用法 |
---|---|
括弧運算子 | () 優先順序和引數群組 |
算術運算子 | + (加) - (減/ 號) * (乘) / (除) ^ (乘冪) |
比較運算子 | = (等於) > (大於) < (小於) >= (大於或等於) <= (小於或等於) <> (不等於) |
文字串連運算子 | & (串連) |
邏輯運算子 | && (and) || (或) |
資料類型
您不需要投射、轉換或指定在 DAX 公式中所用資料行或值的資料類型。 當在 DAX 公式中使用資料時,DAX 會自動識別所參考資料行及所輸入值的資料類型,並在必要時執行隱含轉換以完成指定的作業。
例如,如果您嘗試在日期值中新增數值,引擎就會在函式內容中解譯作業,將數值轉換為一般資料類型,然後以預期的格式 (日期) 呈現結果。
不過,若要成功轉換這些值仍有一些限制。 如果值或資料行的資料類型與目前作業不相容,DAX 就會傳回錯誤。 而且,DAX 也不會提供函式來讓您明確變更、轉換或投射已匯入資料模型的現有資料資料類型。
重要
DAX 不支援使用 variant 資料類型。 因此,當您將資料載入或匯入資料模型時,每個資料行中的資料通常都應該是一致的資料類型。
有些函式會傳回純量值 (包括字串),而有些函式則會使用數值 (整數和實數) 或日期和時間。 DAX 函式一節中會描述每個函式所需要的資料類型。
您可以使用包含多筆資料行和資料列資料作為函式引數的資料表。 某些函式也會傳回資料表,它們儲存在記憶體中,可以作為其他函式的引數使用。
日期和時間
DAX 會使用 Microsoft SQL Server 所使用的 datetime 資料類型來儲存日期和時間值。 Datetime 格式會使用浮點數,其中 Date 值會對應至整數部分,代表自 1899 年 12 月 30 日以來的天數。 Time 值會對應至日期值的十進位部分,其中小時、分鐘和秒是由一天的小數部分表示。 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"
)
注意
並非所有版本的 Power BI Desktop、Analysis Services 和 Excel 中的 Power Pivot 都支援 DAX 日期和日期時間類型常值格式。 新的和更新的 DAX 功能通常會先在 Power BI Desktop 中引進,稍後再包含在 Analysis Services 和 Excel 中的 Power Pivot 中。