Power BI之DAX神功:第3卷第5回 多张表使用SUMMARIZE函数
《DAX神功》第1卷第15回 我们讲解了 在筛选上下文中使用DISTINCT和SUMMARIZE
同时,也告知大家为何在《孙兴华讲PowerBI火力全》中我对SUMMARIZE一带而过的原因
但是,之前我们始终站在DISTINCT、VALUES、SUMMARIZE、SummarizeColumns它们区别角度来讲的SUMMARIZE,今天我们针对SUMMARIZE讲讲它的多表情况下的原理。


一、跨表使用SUMMARIZE函数
【新建表】表1 = VALUES('商品表'[规格])
【新建表】表2 = SUMMARIZE('商品表','商品表'[规格])
// 取商品表规格列不重复元素的表,这时结果是一样的
// 《DAX神功》第1卷第15回 我们做过详细解释

【新建表】表3 = SUMMARIZE('销售表','商品表'[规格])
// 因为销售表和商品表之间存在关系,跨表就相当于:销售表左外连接商品表

原理:要确保商品表和销售表是一对多关系

如果你就想用多对多关系,你太厉害了,能用这个关系的人都是高手。《DAX神功》第4卷我会讲,但是我不推荐你用。明明知道山上有老虎,还是要向着山去行走,形容明知有危险或做的决定是错的还是要继续进行下去。
二、回答网友问题
网友对《权威指南》本节课计算每个产品每天的平均销售量看不懂。
假设,我们在销售表中增加同一商品的重复日期
相当于A01这个商品在2021/1/1有两笔销售

现在我如果想得到,每天每个商品名称不重复的表:原理同上
【新建表】表4 = SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称])

有了这张表,我想干嘛就可以干嘛了:
【新建表】表5 = addcolumns(SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称]),"平均分",CALCULATE(AVERAGE('销售表'[销售])))
// Addcolumns函数的原理,我们在《DAX神功》第3卷第4回 刚刚讲过

上图我们在新建表下完成的,度量值下也可以完成:
【度量值】平均分度量值 = AVERAGEX(SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称]),CALCULATE(AVERAGE('销售表'[销售])))
注意:与书不一样的地方
【1】summarize生成一张临时表:

【2】AVERAGEX与SumX一样,都是迭代函数,逐行计算,只是最后的列总计是求平均还是求和由AVERAGEX与SumX决定。
分析公式:AVERAGEX(临时表,CALCULATE(AVERAGE('销售表'[销售])))

AVERAGEX(临时表,表达式)

而表达式是:CALCULATE(AVERAGE('销售表'[销售]))
书中写的是:CALCULATE(Sum('销售表'[销售])) // 也许他有他要表达的意思,但是从题意上讲计算每个产品每天的平均销售,应该是用我写的表达式。
如果我们按书中的方式写成:
度量值 = AVERAGEX(SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称]),CALCULATE(sum('销售表'[销售])))
// 书中的意思应该这样说:计算每个产品每天的销售平均值

三、其实也可以利用SUMMARIZE添加列
《DAX神功》第1卷第15回 我们提到从速度上讲,SummarizeColumns优于ADDCOLUMNS+SUMMARIZE优于SUMMARIZE
SummarizeColumns不能应用于绝大多数度量值,所以在新建表中,我们优先使用SummarizeColumns。在度量值中优先使用ADDCOLUMNS+SUMMARIZE。
这里提到的速度并不是天壤之别,即便是数据量大了以后,也不一定会相差太离谱。例如ExcelVBA中定义变量的数据类型理论上要比不定义快,但是能快多少,大家心中应该已经有数了。想用什么你随意,写对了才是最重要的,有能力还是建议将电脑配置成主流入门级别或以上。
【度量值】s = averagex(SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称],"销售",AVERAGE('销售表'[销售])),[销售])
临时表计算流程:SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称],"销售",AVERAGE('销售表'[销售]))

外层:averagex(临时表,临时表[销售列]) // 这个迭代函数就不用介绍了
Addcolumns+SUMMARIZE的方法我们经常在用:
【新建表】表7 = addcolumns(SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称]),"新销售",calculate(AVERAGE('销售表'[销售])))
// 我们通过addcolumns对临时表添加列

【新建表】a加s = AVERAGEX(addcolumns(SUMMARIZE('销售表','销售表'[日期],'商品表'[商品名称]),"新销售",calculate(AVERAGE('销售表'[销售]))),[新销售])

关于SUMMARIZE分组聚合、子类别小计与总计、只显示总计,我们已经在《DAX神功》第1卷第15回 做了详细解释

孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等