DAX 表達式主要用於創建度量列(Measure),度量值是根據用戶選擇的Filter和公式,計算聚合值,DAX表達式基本上都是引用對應的函數,函數的執行有表級(Table-Level)上下文和行級(Row-Level)上下文之別;其交互行為都是通過表之間的關系實現的,用戶選擇的Filter,會通過關系對數據進行過濾,是PowerBI報表呈現的數據具有動態交互的特性。在我開發的PowerBI報表項目中,經常使用的DAX表達式函數,其實並不是很多,本文分享一些入門級的常用函數,附上簡單的注釋,希望對新手設計PowerBI報表有所幫助。
我的PowerBI開發系列的文章目錄:PowerBI開發
一,常用的操作符
在DAX表達式中,常用的操作符是:
- 文本使用雙引號作為界定符,
- 等號是“=”號,不等號是:<>
- 賦值使用“=”號,
- 布爾值使用 TRUE()和FALSE()函數,
- 空值使用BLANK()函數表示,
- 集合使用大括號{}表示,例如,包含三個元素的集合: {1,2,3}
- 字符的連接符號是:&
- 邏輯運算符號是:邏輯與是 &&,邏輯或是: ||
二,過濾函數
過濾函數能夠操作數據的上下文,以實現數據的動態計算,功能非常強大,用於度量中,關於過濾器函數的詳細介紹,請查看:《DAX 第三篇:過濾器函數》
三,統計函數
統計函數用於創建聚合,對數據進行統計分析。在使用統計函數時,必須考慮到數據模型,表之間關系,數據重復等因素,一般都會搭配過濾函數實現數據的提取和分析。
統計量一般是:均值、求和、計數、最大值、最小值、求中位數、獲得分位數等。關於統計函數的詳細介紹,請查看:《DAX 第六篇:統計函數》
四,文本函數
在DAX表達式中,字符串使用雙引號界定:
1,格式函數
按照指定的格式把值轉換成文本
FORMAT(<value>, <format_string>)
2,空值
在DAX中,空值(Blank) 和數據庫的NULL值是相同的,通過函數ISBLANK(value)判斷當前的字段值是否是空值。
BLANK()
ISBLANK(<value>)
3,查找函數
在一段文本中查找字符串時,從左向右讀取文本,查找函數返回第一次匹配的字符的序號,序號從1開始,依次遞增。search函數不區分大小寫,而find函數區分大小寫。
FIND(<find_text>, <within_text>[, [<start_num>][, <NotFoundValue>]])
SEARCH(<find_text>, <within_text>[, [<start_num>][, <NotFoundValue>]])
參數 NotFoundValue 是可選的,當查找不到匹配的子串時,返回該參數的值,一般設置為0,-1或BLANK()。
如果不設置該參數,而查找函數查找不到匹配的子串時,函數返回錯誤。可以通過IFERROR函數處理錯誤,例如:
= IFERROR(SEARCH("-",[PostalCode]),-1)
5,拼接函數
把表中的數據按照指定的分隔符拼接成字符串
CONCATENATEX(<table>, <expression>, [delimiter])
示例,Employees表中包含[FirstName] 和 [LastName]兩列,把這兩列拼接成一個字符串:
CONCATENATEX(Employees, [FirstName] & “ “ & [LastName], “,”)
6,包含字符串
檢查文本是否包含特定的字符串,並可以使用通配符:? 代表單個字符,* 代表任意多個字符,~ 代表把通配符轉義為普通字符。
CONTAINSSTRING(<within_text>, <find_text>)
CONTAINSSTRINGEXACT(<within_text>, <find_text>)
注意:CONTAINSSTRING不是大小寫敏感的,而CONTAINSSTRINGEXACT 函數是大小寫敏感的。
7,截取子串
從字符串中截取特定長度的字符串,start_pos是指字符的位置,從1開始,num_chars是指截取的子串的長度:
LEFT(<text>, <num_chars>) RIGHT(<text>, <num_chars>) MID(<text>, <start_pos>, <num_chars>)
8,替換
instance_num是指替換的次數,num_chars是指被替換的字符的數量:
SUBSTITUTE(<text>, <old_text>, <new_text>, <instance_num>)
REPLACE(<old_text>, <start_pos>, <num_chars>, <new_text>)
9,其他常用函數
- TRIM(<text>) :清理文本兩端的空格
- LOWER(<text>) :把文本轉換為小寫格式
- UPPER (<text>) :把文本轉換為大寫格式
- LEN(<text>) :計算文本的字符數量
- VALUE(<text>) :把文本型數值轉換為數值型
五,邏輯函數
邏輯函數用於表達式,以返回邏輯運算的結果。
1,邏輯判斷函數
檢查邏輯條件是否滿足,如果滿足,返回value_if_true,如果不滿足,返回value_if_false。
IF(logical_test>,<value_if_true>, <value_if_false>)
等於使用“=”表示,邏輯與使用“&&”表示,邏輯或使用“||”表示,而邏輯非,通常使用NOT()函數來實現:
NOT(<logical>)
2,布爾值函數
通常用於表示數據庫的bit類型的值,表示邏輯真和假
TRUE()
FALSE()
3,錯誤函數
如果表達式返回錯誤,返回value_if_error;如果表達式不返回錯誤,返回表達式的值。
IFERROR(expression, value_if_error)
錯誤函數等價於:
IFERROR(A,B) := IF(ISERROR(A), B, A)
4,包含邏輯
表(Table)表達式是由大括號構成的集合:{value1,value2,,vlaueN}
IN操作符的用法是:
<scalarExpr> IN <tableExpr>
包含行函數的用法是:
CONTAINSROW(<tableExpr>, <scalarExpr>[, <scalarExpr>, …])
示例,以下兩個表達式是等價的:
[Color] IN { "Red", "Yellow", "Blue" } CONTAINSROW({ "Red", "Yellow", "Blue" }, [Color])
六,信息函數
信息函數用於查看值的信息,比如,查看值是否跟類型相匹配等。
1,檢查空值
ISBANK( value ):用於檢測value是否是blank
=IF( ISBLANK('CalculatedMeasures'[PreviousYearTotalSales]) , BLANK() , ( 'CalculatedMeasures'[Total Sales]-'CalculatedMeasures'[PreviousYearTotalSales] ) /'CalculatedMeasures'[PreviousYearTotalSales])
2,檢查錯誤
ISERROR(value):用於檢測value是否是錯誤
= IF( ISERROR( SUM('ResellerSales_USD'[SalesAmount_USD]) /SUM('InternetSales_USD'[SalesAmount_USD]) ) , BLANK() , SUM('ResellerSales_USD'[SalesAmount_USD]) /SUM('InternetSales_USD'[SalesAmount_USD]) )
3,檢查值的特性
- ISEVEN(number):檢查數字的奇偶性
- ISODD(number):檢查數字的奇偶性
- ISNUMBER(<value>):檢查值是否是數字
- ISTEXT(<value>):檢查值是否是文本
- ISNONTEXT(<value>) :如果值不是文本,或者是blank,那么返回True;否則返回False。
4,包含數據
如果在這些列中存在或包含所有引用列的值,則返回true; 否則,該函數返回false。
CONTAINS(<table>, <columnName>, <value>[, <columnName>, <value>]…)
例如,下面的DAX表示:檢查FactSales表中是否存在一行數據,其ProductKey列的值是214,同時CustomerKey列的值是11185,如果存在這樣一行數據,那么返回True,否則返回False:
=CONTAINS(FactSales, [ProductKey], 214, [CustomerKey], 11185)
5,包含行
IN 操作符和CONTAINSROW()函數的作用是相同的:
<scalarExpr> IN <tableExpr> ( <scalarExpr1>, <scalarExpr2>, … ) IN <tableExpr> CONTAINSROW(<tableExpr>, <scalarExpr>[, <scalarExpr>, …])
DAX中NOT IN不是一個操作符,要實現不存在的操作,可以把NOT 放到整個IN表達式的前面:
NOT [Color] IN { "Red", "Yellow", "Blue" }
例如,使用IN和 CONTAINSROW()函數表示包含特定的值,並列出其否定形式:
FILTER(ALL(DimProduct[Color]), [Color] IN { "Red", "Yellow", "Blue" }) FILTER(ALL(DimProduct[Color]), CONTAINSROW({ "Red", "Yellow", "Blue" }, [Color])) FILTER(ALL(DimProduct[Color]), NOT [Color] IN { "Red", "Yellow", "Blue" }) FILTER(ALL(DimProduct[Color]), NOT CONTAINSROW({ "Red", "Yellow", "Blue" }, [Color]))
6,返回用戶信息
從鏈接時提供給系統的憑證中返回域名和用戶名:
USERNAME()
例如,從授權用戶表中查找用戶,如果該用戶存在於授權表(UserTable)中,那么返回Allowed,否則返回空值:
=IF(CONTAINS(UsersTable,UsersTable[login], USERNAME()), "Allowed", BLANK())
七,算術函數和日期/時間函數
參考《Math and Trig functions》和《Date and time functions》
參考文檔: