平时在工作中,有时候需要对一些一维数据进行按年、月汇总,而这些数据又是ERP最为常见的一维报表,这些字段都是一般标准的,如下单日期、订单号、订单项次号、料件编号、规格型号等。
这些数据都是在生产计划排程中供需明细表中经常需要看的数据,可以把这些数据进行二次分析,因为数据每天都有更新,用数据透视表,还是需要每天手动刷新,直接用系统看的话,也不太方便,需要打开系统,所以就需要建模。

建模的时候,有时候就需要按年月分类分析,此时源数据中一般不会单独把月这一列取出来,而在建模的时候又不想用辅助列,应该如何处理呢?这里古老师分享两个案例。供大家研究探讨。Office 版本:365.
按年月汇总-不加辅助列
下图中需要按月汇总销量,其中表1中的A,B两列是数据主表,一般做为计划员的订单池,每天更新,更新完后,需要在一个新表按月汇总销量。

如果用辅助列的话,只需要在C列加上一列辅助列,在表2用SUMIFS汇总求和就可以了。如下图中录入一列辅助列,公式1:=MONTH(A2),下拉填充,公式2:=SUMIFS(B:B,C:C,E2),下拉填充,即可汇总。可以说辅助列确实解决了很多不必要的麻烦。非常高效;

但是建模的时候,为了表格的整体架构,就是不想加辅助列,应该如何操作呢?换作是365版本以前,公式可能更加长,新版本的OFFICE可以用到建模最佳搭档函数BYCOW,为了方便大家理解,先写出这个公式
C2=BYROW(A2:A14,LAMBDA(X,MONTH(X)))

此时可以看到生成了一列动态数组,这一列数据是可以直接作为其他函数的引用的。所以只需要配合FILTER和SUM函数就可以实现不用辅助列汇总数据,在汇总数据前,先把月单独作为条件写出来。
E2=VSTACK("月份",TEXT(SORT(UNIQUE(BYROW(A2:A14,LAMBDA(X,MONTH(X))))),"#月"))
函数说明:把月份这一列,通过UNIQUE删除重复项,再用SORT进行排序,最后用VSTACK,加上标题,就实现了一键生成汇总的月份的条件。

有了这个条件就可以通过FILTER函数或者IF函数来判断结果,最后通过SUM汇总就可以了
E2=SUM(FILTER($B$2:$B$14,BYROW($A$2:$A$14,LAMBDA(X,MONTH(X)))=$D3))
F2=SUM(IF(BYROW($A$2:$A$14,LAMBDA(X,MONTH(X)))=$D3,$B$2:$B$14,0))
结果如下图,可以看到不用辅助列,也可以得到我们想要的结果了。如果A列的数据有增加,只需要把对应的范围$A$2:$A$14,拉大一点就可以了;

多条件引用-不加辅助列
在用引用函数如XLOOKUP函数的时候,对引用数据唯一性要求很高,有时候要用到多条件才能把数据一一对应,不会出现一对多,下图数据中
生产订单号如果不加行号的的话就不是唯一条件,如果引用需求来源的话,直接引用,就只能引用到第一项,所以我们需要把生产订单号和行号串起来才能引用。

最简单的方法还是在表1增加一列辅助列,这样就可以直接引用了,参考方法1,我们同样可以不用辅助列
录入函数=BYROW(A2:B12,LAMBDA(X,TEXTJOIN("-",,X))),此时生产一列辅助列,把生产订单加行号串联在一起了。

录入函数:
=XLOOKUP(E2:E12,BYROW(A2:B12,LAMBDA(X,TEXTJOIN("-",,X))),C2:C12)
就可以不额外占用辅助列,得到一样的结果。

最后总结
理解BYCOW和LAMBDA函数和OFFICE365 动态数组后,才能理解这两个公式的强大之处,BYCOL函数是转成行,所以当不想额外占用行、列的单元格作为辅助列的时候,首先想到的就是此函数的经典组合。
BYCOW+LAMBDA
