DAX從入門到精通 2-6-1 聚合函式

常用的DAX函式

目前,你已經瞭解了DAX的基礎知識,以及如何處理報錯的資訊。接下來的是一些非常常用的DAX函式表示式。本章的剩餘部分,會介紹這些函式,他們很大可能會被應用到你的模型當中。

聚合函式

幾乎所有的資料模型都提供聚合函式。DAX提供了一系列的聚合函式,可以用來對錶中列的值進行聚合然後返回一個值。我們稱這樣的函式為聚合函式。例如,下面這個例子,計算了sales表salesamount列的所有值的和。

Sales := SUM ( Sales[SalesAmount] )

sum函式計算了表中該列所有行的值,但是這些行都是經過篩選器,行,列以及透視表的過濾條件過濾後得到的。聚合函式(SUM, AVERAGE, MIN, MAX, STDEV, and VAR)只能對數值型別和日期型別的值進行計算。

劃重點MIN和MAX有些不一樣。如果給它們提供兩個引數,他們將返回這兩個值中的其中一個。因此,min(1,2)返回1 max(1,2)返回2。有時候,當你要計算複雜表示式的最小和最大值時候,使用這個函式會比IF函式用起來方便。

和Excel類似,DAX對這些函式提供了一些特殊的語法,使他們可以包含數字型別或者非數字型別,例如文字。特殊的語法就使簡單的價格字尾A,這個和excel中很像。但是,這些函式只對列中只有true和flase值有效,因為true表示1,false表示0。文字值總是被標記為0。因此,無論列中的內容使上面,如果對一個文字列使用MAXA函式,你總是得到0。另外,DAX在計算聚合的時候,總是忽略空值。即使這些函式可以用在非數值的列中,而不報錯。但是結果通常是沒有意義的,因為函式不會把文字轉為數值。這些函式有 AVERAGEA, COUNTA,MINA, and MAXA。

劃重點:雖然有些統計函式和EXCEL中的名字相同,但是在使用方式上,兩者有非常大的不同。DAX的列有資料型別,計算的結果會依賴這些資料型別。Excel的可以對每個單元格處理不同的資料型別,而DAX對每列處理一種資料型別,Excel的函式已單元格的值計算,可以不用明確定義資料型別。如果PowerPivot的列是數值型別,這列的所有值都必須是數字或者空值。如果列是文字型別,那麼這列在使用聚合函式的時候,都返回0(除了counta),即使這些值可以轉換為數字,而excel會逐一對單元格計算。因此,這些聚合函式對文字型別的列基本是沒有意義的。

上面的函式對聚合計算非常有效。但是有的時候,你關注的不是聚合值,而是對他們計數。因此,DAX也提供了一系列的函式來對行計數。

count只能用於數值型別的列counta可以用於所有型別的列countblank列中的空值數量countrows返回了表中的行的數量 返回列中所有不同值的數

counta是一個特殊的以A為結尾的函式。因為它返回的是列中不為空的行的數量,對列的型別沒有要求。如果你要計算包含了空值的行,你可以使用countblank函式。最後,如果你要計算表的所有行數量,可以使用countrows函式。注意countrows需要一個表作為引數,而不是一個列。

劃重點對於表中的任何列,counta()+countblank()總是等於countrows()

最後一個函式是distinctcount,它非常有用,它的作用和它的名稱一樣,計算列中的不同的值,它只需要一個引數。distinctcount把blank也作為一個值計算在內。

目前所介紹的聚合函式都是針對列的計算(除了countrows針對表)。因此,你只能對某一列進行聚合。另外還有些函式可以對錶達式進行聚合計算,而不是列。這類函式非常重要且有用,尤其是當你需要對關聯表進行計算的時候。例如,如果sales表包含所有的交易記錄,而相關聯的product表包含一個產品的所有資訊,包含它的成本,你可以透過定義這樣的表示式在計算交易資料的所有cost。

Cost := SUMX ( Sales, Sales[Quantity] * RELATED ( Product[StandardCost] ) )

該度量值計算了sales表的每一行的數量乘以product表的單價,最後,它返回所有這些計算結果的彙總值。所有以X為結尾的函式都有如下的計算行為:對錶中的每行(第一個引數)按表示式計算(第二個引數),然後根據相關的聚合函式返回相關的聚合結果(SUM, MIN, MAX or COUNT)。在後面的章節會進一步的學習這些函式的行為,因為要了解它們的計算邏輯,你需要了解上下文的概念。以X為結尾的函式例如SUMX,AVERAGEX, PRODUCTX, COUNTX, COUNTAX, CONCATENATEX, MINX,and MAXX等。另外還有些函式不以X結尾,但是也是迭代函式,例如filter,addcolums。這些後面都會詳細介紹。