我想聚合、合并、压缩一些值,如下所示
输入是表格,输出是单个单元格上的动态数组公式,目标是根据第一列的唯一值聚合其他列
我的输入是一个表(名为 TAB)
姓名 | 服务 | 类型 |
---|---|---|
02HPP002NZ | 1:基本 | unix |
02HPP002NZ | 1:基本 | unix |
02HPP002NZ | 3:相关 | 获胜 |
02HPP009O4 | 3:相关 | nt |
02HPP001L7 | 2:标准 | unix |
02HPP001L7 | 2:标准 | Linux |
02HPP009O4 | 1:基本 | nt |
在单个单元格 E2 上使用数组公式的所需输出
姓名 | 服务 | 类型 |
---|---|---|
02HPP002NZ | 1:基本 / 3:相关 | unix/win |
02HPP009O4 | 3:相关 / 1:基本 | nt |
02HPP001L7 | 2:标准 | unix/linux |
我使用的公式如下:
=LET(
Names; TAB[Name];
uNames; UNIQUE(Names);
aggfunc; LAMBDA(colIdx; MAP(uNames; LAMBDA(x; BYCOL(CHOOSECOLS(TAB;colIdx); LAMBDA(col;TEXTJOIN(" / "; TRUE; UNIQUE(FILTER(col; Names=x))))))));
HSTACK(
uNames;
aggfunc(2);
aggfunc(3)
)
)
正如您所注意到的,我对“aggfunc(x)”进行了硬编码(x 是要返回的表的列号)。我想使用单个函数
aggfunc(numCols)
和 numCols 是列数数组。公式应该如下所示,但不幸的是它不起作用。它给出了错误“#CALC!”
=LET(
Names; TAB[Name];
uNames; UNIQUE(Names);
numCols; SEQUENCE(COLUMNS(TAB[#Data]));
aggfunc; LAMBDA(colIdx; MAP(uNames; LAMBDA(x; BYCOL(CHOOSECOLS(TAB;colIdx); LAMBDA(col;TEXTJOIN(" / "; TRUE; UNIQUE(FILTER(col; Names=x))))))));
HSTACK(
uNames;
aggfunc(numCols)
)
)
使用 BYROW 代替 MAP 的替代公式
=LET(
a; TAB[Name];
b; TAB[Type];
c; TAB[Service];
ua; UNIQUE(a);
HSTACK(
ua;
BYROW(ua; LAMBDA(x; TEXTJOIN(" / ";TRUE;UNIQUE(FILTER(b;a=x)))));
BYROW(ua; LAMBDA(x; TEXTJOIN(" / ";TRUE;UNIQUE(FILTER(c;a=x)))))
)
)
我也尝试过使用PowerQuery,但使用group by,然后添加自定义列,但由于我有多个列,实现我的目标非常痛苦。如果有人感兴趣,请按照以下步骤操作:
Name
(第一列)AGGNAME
All Rows
Type
=Text.Combine(List.Transform(List.Distinct([AGGNAME][#"Type"]), Text.From), " / ")
Type
(在公式中)。如果输入表的名称发生更改或者表具有多个列,则使用 PowerQuery 会变得很痛苦。
非常感谢您抽出宝贵的时间,如果您需要更多信息,请随时询问。 问候, T.
尝试这个公式:
=LET(
n,Tab[Name],nUnique,UNIQUE(n),
agg, LAMBDA(colIdx,n_,TEXTJOIN("/",TRUE,UNIQUE(FILTER(CHOOSECOLS(Tab,colIdx),n=n_)))),
DROP(
REDUCE("",nUnique,LAMBDA(r,n_,VSTACK(r,HSTACK(n_,agg(2,n_),agg(3,n_))))),1)
)