暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PowerBI中的查询函数Summarize的工作原理

BISeven 2021-09-16
1533

本公众号之前写过一篇关于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/

文章转载自BISeven,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论