PowerBI開發 第四篇:DAX 表達式基礎


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

 

參考文檔:

DAX basics in Power BI Desktop

Data Analysis Expressions (DAX) Reference


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM