DAX有三個用於生成分組聚合數據的函數,這三個函數有兩個共同的特徵:分組列和擴展列。express
在分組列和擴展列上,這三個函數有各自獨特的處理方式。函數
SUMMARIZE函數對相互關聯的Table按照特定的一個字段(分組列)或多個字段,進行分組聚合。因爲分組列是惟一的,經過SUMMARIZE函數,能夠得到多列的惟一值構成的二維表:spa
SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>, <expression>]…)
參數註釋:excel
該函數的返回值是一個彙總表,彙總表包含分組列和自定義的擴展列。code
1,得到多列的惟一值blog
分組列是惟一的,能夠不返回彙總列,而只返回分組列,這樣獲得的表是多列的惟一值。ci
SUMMARIZE(ResellerSales , DateTime[CalendarYear] , ProductCategory[ProductCategoryName] )
2,得到彙總數據文檔
例如,對數據表 ResellerSales ,按照字段 DateTime[CalendarYear] 和 ProductCategory[ProductCategoryName]分組,計算 ResellerSales[SalesAmount]和 ResellerSales[DiscountAmount]的加和 。字符串
SUMMARIZE(ResellerSales , DateTime[CalendarYear] , ProductCategory[ProductCategoryName] , "Sales Amount", SUM(ResellerSales[SalesAmount]) , "Discount Amount", SUM(ResellerSales[DiscountAmount]) )
該函數利用ResellerSales和DateTime、ProductCategory之間的關係,獲得關聯表數據(是一箇中間臨時表),按照DateTime[CalendarYear] 和 ProductCategory[ProductCategoryName] 對關聯以後的數據進行分組,分別計算銷售和折扣的加和。get
注意,ResellerSales和DateTime,ResellerSales和ProductCategory 必須顯式存在關係,不然,不能用於分組列中。
3,分組聚合的做用
第一是做爲中間臨時表,爲後續的計算提供數據;第二是用於建立新表,在Modeling菜單中,經過「New Table」從DAX表達式中建立新的Table:
參考文檔:SUMMARIZE – groupping in data models (DAX – Power Pivot, Power BI)
4,ROLLUP選項
ROLLUP函數用於對分組列進行上卷操做,該函數用於預約義多個分組集:
SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, ROLLUP(<groupBy_columnName>[,< groupBy_columnName>…])][, <name>, <expression>]…)
做用相似於TSQL的 rollup函數,例如,對於group by rollup(a,b) ,其表示的分組集是group by (), group by (a), group by (a,b)。
5,ROLLUPGROUP選項
ROLLUPGROUP函數用於計算小計組。若是把ROLLUPGROUP來代替ROLLUP函數,那麼ROLLUPGROUP經過向groupBy_columnName列的結果添加彙總行來產生和ROLLUP相同的結果。 可是,在ROLLUP語法中添加ROLLUPGROUP()可用於防止彙總行中的部分小計。例如,ROLLUP(ROLLUPGROUP(A,B)),分組集是(A,B)和():
SUMMARIZE(ResellerSales_USD , ROLLUP(ROLLUPGROUP( DateTime[CalendarYear], ProductCategory[ProductCategoryName])) , "Sales Amount (USD)", SUM(ResellerSales_USD[SalesAmount_USD]) , "Discount Amount (USD)", SUM(ResellerSales_USD[DiscountAmount]) )
6,ISSUBTOTAL選項
只能用於SUMMRIZE函數中,用於檢查該列是否爲小計組。
SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, ROLLUP(<groupBy_columnName>[,< groupBy_columnName>…])][, <name>, {<expression>|ISSUBTOTAL(<columnName>)}]…)
例如,使用該函數檢查CalendarYear和 ProductCategoryName是否爲小計組:
SUMMARIZE(ResellerSales_USD , ROLLUP( DateTime[CalendarYear], ProductCategory[ProductCategoryName]) , "Sales Amount (USD)", SUM(ResellerSales_USD[SalesAmount_USD]) , "Discount Amount (USD)", SUM(ResellerSales_USD[DiscountAmount]) , "Is Sub Total for DateTimeCalendarYear", ISSUBTOTAL(DateTime[CalendarYear]) , "Is Sub Total for ProductCategoryName", ISSUBTOTAL(ProductCategory[ProductCategoryName]) )
該函數也用於分組聚合,和SUMMARIZE函數的差別在於分組列之間的關係是非必需的,分組列之間執行的交叉鏈接或自動存在。
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
參數註釋:
返回值是彙總表,包含分組列和自定義列,返回的數據行中,至少包含一個非空值,若是在一個數據行中,全部expression的結果都是BLANK/NULL,那麼該行不包含在彙總表中。
1,分組字段進行笛卡爾乘積
如下DAX按照SalesTerritory的字段Category 和 Customer的Education字段進行分組,並對Customer表進行過濾:
SUMMARIZECOLUMNS ( 'SalesTerritory'[Category], 'Customer' [Education], FILTER('Customer', 'Customer'[First Name] = 「Alicia」) )
對過濾以後的數據進行彙總計算,返回的結果是Category和Eduction的笛卡爾乘積。
2,IGNORE選項
把包含NULL/BLANK的行過濾掉
SUMMARIZECOLUMNS(<groupBy_columnName>[, < groupBy_columnName >]…, [<filterTable>]…[, <name>, IGNORE(…)]…)
例如,若是Sum(Sales[Qty] )中包含一個NULL/BLANK,那麼把該行從結果集中移除:
SUMMARIZECOLUMNS( Sales[CustomerId], "Total Qty", IGNORE( SUM( Sales[Qty] ) ), 「BlankIfTotalQtyIsNot3」, IF( SUM( Sales[Qty] )=3, 3 ) )
3,其餘選項
GROUPBY函數除了不能再擴展列中使用CALCULATE函數以外,和SUMMARIZE的用法相同:
GROUPBY (<table>, [<groupBy_columnName1>]..., [<name>, <expression>]… )
expression參數中不能使用CALCULATE函數,CURRENTGROUP 函數只能用於最頂層的表掃描(Table Scan)操做。
GROUPBY函數執行的操做是:
在該函數中,能夠調用CURRENTGROUP 函數:
CURRENTGROUP()
該函數只能用於GROUPBY函數的expression參數中,表示當前分組。 CURRENTGROUP函數不帶參數,僅支持做爲如下聚合函數之一的第一個參數:AverageX,CountAX,CountX,GeoMeanX,MaxX,MinX,ProductX,StDevX.S,StDevX.P,SumX,VarX.S,VarX.P。舉個例子,對Sales表,按照Country和Category進行分組,計算每一個分組中Price * Qty的乘積之和。
GROUPBY ( Sales, Geography[Country], Product[Category], 「Total Sales」, SUMX( CURRENTGROUP(), Sales[Price] * Sales[Qty]) )
參考文檔: