我想聚合、合并、压缩一些值,如下所示
输入是一个表,输出是单个单元格上的动态数组公式,目标是根据第一列的唯一值聚合其他列
我的输入是一个表格(名为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 然后添加自定义列,但由于我有多个列,因此实现我的目标非常痛苦。如果有人可能感兴趣,请按照以下步骤操作:
- 选择表格中的任意单元格
- 选择菜单数据,然后从表/范围(在左侧)
- 它打开PowerQuery 编辑器,您现在需要选择列
Name
(第一列) - 在菜单Transform中,选择Group By。打开一个新窗口,我填写了如下所示的字段
- 新列名:
AGGNAME
- 手术:
All Rows
- 单击“确定”
- 现在您有一张包含两列的表格,标题分别为名称和 AGGNAME(表格)
- 在菜单“添加列”中,选择“自定义列”。打开一个新窗口,我输入以下值
- 新列名:
Type
- 自定义列公式:
=Text.Combine(List.Transform(List.Distinct([AGGNAME][#"Type"]), Text.From), " / ")
- 您现在有 3 列“名称”、“AGGNAME”和“类型”。
- 您需要重复步骤 6 并
Type
根据您的列的名称更改名称(在公式中)。 - 插入所有需要的新列后,必须删除AGGNAME列
- 现在转到菜单主页并单击“关闭并加载”。它将创建一个具有与我需要相同的输出的新表。
如果输入表的名称发生变化或者表有多个列,使用 PowerQuery 就会变得很痛苦。
我的 Office 365 版本尚不包含功能“GROUPBY” (版本 2406 内部版本 16.0.17726.20206) 64 位。
非常感谢您抽出时间,如果您需要更多信息,请随时询问。问候,T。