excel SUMIF,用于多个列的UNIQUE条件,将所有同名值相加

1sbrub3j  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(458)

我有一个包含多行和多列(数百个)的表,为了简单起见,它看起来非常像这样:
| 姓名/日期|22年1月|22年2月|22年3月|4月22日|5月22日|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 杰克|十个|四个|七|1个|十个|
| 玫瑰|六个|四个|第二章|三个|三个|
| 玛丽|第二章|六个|七|第二章|九|
| 胡安|九|八个|1个|五个|十个|
| 玫瑰|十个|八个|五个|七|1个|
| 胡安|六个|四个|第二章|五个|九|
| 杰克|十个|七|七|四个|五个|
| 玛丽|五个|1个|1个|第二章|三个|
| 玫瑰|第二章|四个|四个|1个|1个|
我的目标是创建一个数组公式,对每个唯一名称和每个日期的值求和,因此最后它应该如下所示:
| 姓名/日期|22年1月|22年2月|22年3月|4月22日|5月22日|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 杰克|二十个|十一|十四|五个|十五|
| 玫瑰|十八|十六|十二|十一|五个|
| 玛丽|七|七|八个|四个|十二|
| 胡安|十五|十二|三个|十个|十九|
限制是我必须在一个单元格中使用函数获得这个输出,并且没有helper列。
虽然使用=HSTACK()=SUMIF(names,UNIQUE(names),values)的组合并不困难,而且每个日期都有不同的SUMIF,但是在这个项目中这是不可能的,因为我必须处理大量的列,而且列数随每次分析而变化。
我试着用=SUMIF(names,UNIQUE(names),values)和lambda数组公式的组合来解决这个问题(类似于BYROWBYCOLMAP,但除了一个错误(BYROW只能返回1列作为输出,BYCOL只能返回1行,MAP函数返回一个与输入大小相同的数组)。可以做些什么来解决这个问题?

s4n0splo

s4n0splo1#

如果唯一则求和

=LET(tData,A1:F10,
    Data,DROP(tData,1),Headers,TAKE(tData,1),Names,TAKE(Data,,1),Values,DROP(Data,,1),
    uNames,UNIQUE(Names),uMatches,XMATCH(Names,uNames),
    cResult,DROP(REDUCE("",SEQUENCE(ROWS(uNames)),LAMBDA(uRow,uMatch,
        LET(rFilter,uMatches=uMatch,
            rResult,BYCOL(Values,LAMBDA(vCol,SUM(FILTER(vCol,rFilter)))),
        VSTACK(uRow,rResult)))),1),
VSTACK(Headers,HSTACK(uNames,cResult)))
vs91vp4v

vs91vp4v2#

您可以尝试使用以下数组公式,该公式将溢出整个结果(包括标题)。在单元格H1中输入以下内容:

=LET(in,A1:F10,n,DROP(TAKE(in,,1),1),nUx,UNIQUE(n),h,TAKE(in,1),d,DROP(in,1,1),
 SUMBYROW,LAMBDA(y,BYROW(nUx, LAMBDA(ux,SUM(FILTER(CHOOSECOLS(d,y),n=ux))))),
 cal,REDUCE(nUx,SEQUENCE(COLUMNS(h)-1),LAMBDA(ac,hh,HSTACK(ac,SUMBYROW(hh)))),
 VSTACK(h, cal))

下面是输出:

它使用REDUCE/HSTACK模式来连接REDUCE函数每次迭代的列结果。有关更多信息,请查看我对以下问题的回答:如何将Excel中的表格从垂直转换为水平,但长度不同。在这种情况下,可以使用唯一名称列表(nUx)初始化REDUCE中的累加器(ac)。
公式仅取决于名称in中定义的范围(input),这样更容易维护,其他名称都是从这里定义的(n-名称,nUx-唯一名称,d-数据,h-报头),使用DROPUNIQUETAKE函数。我们定义了一个用户LAMBDA函数SUMBYROW,以获得更好的组合,从而更容易理解上述模式。我们在每次迭代中对每个列索引调用此函数。

相关问题