题目:
现有每日明细数据,需要每7天插入一行汇总行,对最近7天数据求和。
解法1:
let 源 = Excel.CurrentWorkbook(){[Name="案例"]}[Content], 分组 = List.Transform({0..Number.RoundUp(Table.RowCount(源)/7)-1},each [a=Table.Range(源,_*7,7),b=a&#table({"日期","销量"},{{"汇总",List.Sum(a[销量])}})][b]), 合并 = Table.Combine(分组) in 合并
表中共有39行,每7天一组,那就要先把表分成6份,前5张表每张7行,第6张表共4行。
第二步要对每张表在最后插入一行汇总行,插入行有两种方法,一种是使用Table.InsertRows
,另一种是直接使用#table
构建一张只有一行的表然后和原表连接,我们以后者为例:
这样就得到了6张带汇总行的表,再合并起来即可。
但是还有个问题是我们事先已经知道是39行分为6组,如果后面再增加行数还需要手动调参数,那么可以用表的总行数除以7,向上取整把6做成动态值。
不管第一列是连续日期还是其他任意值,此方法都适用,优先推荐解法1。
解法2:
let 源 = Excel.CurrentWorkbook(){[Name="案例"]}[Content], 分组 = Table.Group(源,"日期",{"a",each _&#table({"日期","销量"},{{"汇总",List.Sum([销量])}})},0,(x,y)=>Number.From(y-x>=#duration(7,0,0,0))), 合并 = Table.Combine(分组[a]) in 合并
首先使用Table.Group
分组,非常常用的一个函数,每一天得到当天日期的一张表。
接着加第四参数0表示局部分组,第五参数自定义分组规则,这是group的非常规用法,之前有讲过,这样就把一列连续日期按照每7天分成一组。
接下来要做的就是对第三参数里的_进行改造,_表示每一个table,再构造一张只有一行汇总行的table,再和_连接起来就可以了。
最后一步深化出分组列[a],使用Table.Combine
将所有分组表合并。
此方法仅当分组依据列为连续日期时才适用,讲这个方法主要是想介绍一下group的用法。
方法很多,前面讲的List.Accumulate
和List.Generate
也都能做,但因为不是最优解就不介绍了。
如果汇总周期为11天或15天。整个公式是不是要重写?
有没有灵活的做法随时调整汇总周期?
把公式里的7改成你要的数字就行了,要灵活的话就把7改成x做成自定义函数,想几天就几天
大神,如果按字段汇总,那公式应该怎么改呢?
谢谢博主抛砖引玉!
接着该案例探讨下:假设通过构建#table作为汇总行,数据列的数量比较多(上千列),在构建table的时候是否需要逐个对每一列数据定义汇总方式list.sum(构建table的字段名是相对容易的,可以通过table.columnname得到字段list)?有没有相对简便方法?