本公众号之前写过一篇关于Summarize的函数,简单的介绍了summarize的用法:
以某些字段进行分组,然后再对某些字段进行聚合运算,其语法如下:
Summarize(tableName, groupby_column, name, expression)
其中,tableName与Groupby_column是必须的参数。
我们在使用Summarzie函数时,通常是计算新建列,但是我们在一些文章中经常看到生成新列的最佳实践是ADDCOLUMNS+Summarize函数的组合,这其中道理又是什么呢?
比如这里有一张表格-Sales:

利用summarize函数生成一张新的表格:
SUMMARIZE(Sales,Sales[Color],"Sales", SUM(Sales[Amount]))
我们可以猜测一下,Summarize应该如何工作?
1. summarize先对颜色进行分组:
Blue
Green
Red
2. 迭代上述步骤的颜色,并筛选Sales表格
Blue筛选出前两行记录
3. 计算新列Sales
Blue:700
Green:800
Red:300
4. 最后生成的结果如下:

这么分析下来还挺有道理,No,No,实际上summarzie大致遵循上述原理,唯一有点不同的是第2步:
即它并不是仅仅以颜色作为筛选器筛选Sales表,实际上它是以【color, product, quantity】作为筛选器去筛选Sales表。
即: 当迭代到Blue时,此时在Sales表上的筛选器包括:
Color = Blue
Product = {Bike, Shirt}
Quantity = {3, 4}
意味着,此时不仅仅Color被筛选了,而且其他的列也被筛选了。
所以,当我们在计算新列时,如果涉及到了修改筛选器的操作时,特别容易生成预期之外的结果。
比如我们稍微修改一下上述DAX,再新建一列:All Sales,清除列【color】上的筛选器
SUMMARIZE(Sales,Sales[Color],"Sales", SUM(Sales[Amount]),"All Sales",CALCULATE(SUM(Sales[Amount]),REMOVEFILTERS(Sales[Color] )))
此时AllSales的结果就出乎我们的意料了,ALL Sales 并没有计算所有产品的和,而是得出了一些奇奇怪怪的数字

我们按照上述的原理进行推导一下,看看这些结果到底是怎么得来的?
1. summarize先对颜色进行分组:
Blue
Green
Red
2. 迭代上述步骤的颜色,并筛选Sales表格,此时Sales表中的筛选器包含:
Color = Blue
Product = {Bike, Shirt}
Quantity = {3, 4}
3. 计算新列All Sales,此时清除了Color中的筛选器,那么Sales表中的筛选器还包括:
Product = {Bike, Shirt}
Quantity = {3, 4}
在Product和Quantity筛选下,Sales表中的记录(下图红框) 其结果正好为(300+400+300 = 1000)

4, 依次迭代所有颜色其All Sales生成的结果:

只要我们明白了summarize的工作原理,那么生成ALL Sales 就有多种方法了(要以实际情况进行选择):
1. 清除Sales表中的所有筛选器:
SUMMARIZE(Sales,Sales[Color],"Sales", SUM(Sales[Amount]),"All Sales",CALCULATE(SUM(Sales[Amount]),REMOVEFILTERS(Sales )))
2. 利用Addcolumns + Summarize 不使用Summarize函数生成的筛选器,利用Addcolumn重新生成筛选器
ADDCOLUMNS(SUMMARIZE(Sales,Sales[Color]),"All Sales",CALCULATE(SUM(Sales[Amount]),REMOVEFILTERS(Sales[Color] )))
在利用Summarize函数进行新建列计算时,一定要注意它的筛选器并不仅仅是Groupby_columnName,它包含表上的所有列,在计算中修改筛选器时,一定要记住它的筛选器不仅仅包含Groupby_columnName,它还包含表上的其他所有列。所以为了不必要的脑细胞死亡,在新建列时,还是以Addcolumn+summarize 函数为主吧
参考:
https://www.sqlbi.com/articles/all-the-secrets-of-summarize/




