Excel - 在单个单元格中使用数组公式(MAP、BYROW、CHOOSECOLS、TEXTJOIN、LAMBDA、FILTER、HSTACK)动态聚合表中的值

问题描述 投票:0回答:1

我想聚合、合并、压缩一些值,如下所示

输入是表格,输出是单个单元格上的动态数组公式,目标是根据第一列的唯一值聚合其他列

我的输入是一个表(名为 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,然后添加自定义列,但由于我有多个列,实现我的目标非常痛苦。如果有人感兴趣,请按照以下步骤操作:

  1. 选择表格中的任意单元格
  2. 选择菜单 Data,然后选择 From Table/Range(位于左侧)
  3. 它会打开PowerQuery编辑器,您现在需要选择列
    Name
    (第一列)
  4. 在菜单变换中,选择分组依据。打开一个新窗口,我填写如下所示的字段
  • 新栏目名称:
    AGGNAME
  • 操作:
    All Rows
  • 点击确定
  1. 现在您有一个包含两列的表,标题为“名称”和“AGGNAME”(表)
  2. 在菜单添加列中,选择自定义列。打开一个新窗口,我输入以下值
  • 新栏目名称:
    Type
  • 自定义列公式:
    =Text.Combine(List.Transform(List.Distinct([AGGNAME][#"Type"]), Text.From), " / ")
  1. 您现在有 3 列“名称”、“AGGNAME”和“类型”。
  2. 您需要重复步骤6并根据您的列名称更改名称
    Type
    (在公式中)。
  3. 插入所有需要的新列后,您必须删除该列AGGNAME
  4. 现在转到菜单Home,然后单击关闭并加载。它将创建一个具有与我需要相同的输出的新表。

如果输入表的名称发生更改或者表具有多个列,则使用 PowerQuery 会变得很痛苦。

非常感谢您抽出宝贵的时间,如果您需要更多信息,请随时询问。 问候, T.

arrays excel dynamic aggregate hstack
1个回答
0
投票

尝试这个公式:

=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)
    )
© www.soinside.com 2019 - 2024. All rights reserved.