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]) )
参考文档: