我想合并数据大多相似的行但对其数量值求和,使用唯一的“id”值,同时保持行中其余数据的完整性。
原始输出如下所示: 原始数据
姓名 | ID | 数量 | 价格 | 成本 | 标签 |
---|---|---|---|---|---|
A | 1111 | 10 | 10 | 1 | 标签 1 |
A | 1112 | 11 | 20 | 2 | 标签 2 |
A | 1113 | 12 | 三十 | 3 | 标签 3 |
A | 1114 | 十三 | 40 | 4 | 标签 4 |
b | 2221 | 20 | 210 | 90 | 标签 21 |
b | 2222 | 21 | 220 | 91 | 标签 22 |
b | 2223 | 22 | 230 | 92 | 标签 23 |
b | 2224 | 23 | 240 | 93 | 标签 24 |
C | 1111 | 31 | 10 | 1 | 标签 1 |
C | 1115 | 三十二 | 50 | 5 | 标签 5 |
C | 1116 | 33 | 60 | 6 | 标签 6 |
C | 1114 | 三十四 | 40 | 4 | 标签 4 |
d | 1112 | 41 | 20 | 2 | 标签 2 |
d | 1117 | 四十二 | 70 | 7 | 标签 7 |
d | 1115 | 43 | 50 | 5 | 标签 5 |
d | 1113 | 四十四 | 三十 | 3 | 标签 3 |
我想把它改造成这样:转换后的数据
姓名 | ID | 数量 | 价格 | 成本 | 标签 |
---|---|---|---|---|---|
b | 2221 | 20 | 210 | 90 | 标签 21 |
b | 2222 | 21 | 220 | 91 | 标签 22 |
b | 2223 | 22 | 230 | 92 | 标签 23 |
b | 2224 | 23 | 240 | 93 | 标签 24 |
埃 | 1111 | 41 | 10 | 1 | 标签 1 |
埃 | 1112 | 52 | 20 | 2 | 标签 2 |
埃 | 1113 | 56 | 三十 | 3 | 标签 3 |
埃 | 1114 | 四十七 | 40 | 4 | 标签 4 |
埃 | 1115 | 75 | 50 | 5 | 标签 5 |
埃 | 1116 | 33 | 60 | 6 | 标签 6 |
埃 | 1117 | 四十二 | 70 | 7 | 标签 7 |
其中表示、和e
的组,对其数量求和,其余重复数据保持原样。a
c
d
使用合并和 VLOOKUP 函数几乎可以实现这一点,但 VLOOKUP 不会返回整行。
答案1
您可以为此使用 Power Query。
使用“数据”>“获取数据”>“从其他来源”>“空白查询”创建空白查询
在 Power Query 编辑器功能区上,使用“主页”>“高级编辑器”
用以下代码替换已有的代码:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
AggCols = {"quantity","name"},
GroupCols = List.RemoveItems(Table.ColumnNames(Source),AggCols),
Groups = Table.Group(
Source,
GroupCols,
{
{"quantity", each List.Sum([quantity])},
{"names",each Text.Combine([name]," + ")},
{"name", each if List.IsEmpty(List.Intersect({[name],{"a","c","d"}})) then "b" else "e"}
}
),
ReorderColumns = Table.ReorderColumns(Groups,{"name","id","quantity","price","cost","label","names"}),
Sorted = Table.Sort(ReorderColumns,{{"name",Order.Ascending},{"id",Order.Ascending}})
in
Sorted
按完成关闭高级编辑器:
如果您想删除我在表格右侧添加的额外“名称”列,只需在 Power Query 编辑器中通过选择标题、右键单击、删除将其删除。
准备就绪后,使用 Power Query 编辑器功能区上的“主页”>“关闭并加载”。
答案2
Power Query 是最佳选择。
将其与您的输出数据结合起来,除了返回实际上未与任何内容组合的单行之外不显示任何内容,并且我不会显示任何单元格公式解决方案,因为它可能不是您想要的,除非运气好。
但是,VLOOKUP
这肯定会返回不止一个单元格。例如,假设您的 ID 在 B 列中,并且您希望返回 C、D、E 和 F 列以查找 ID。(因此,ID 列和这四列位于第二个参数中,即 Excel 要查找的数据表。)
您可以按照这种方式使用该函数:
=VLOOKUP(K1, C1:F500, {2,3,4,5}, FALSE)
是{2,3,4,5}
一个“数组常量”,因此 Excel(所有版本都回到第一个/唯一的 Windows 95 版本......这不是 Excel 处理数组方式的变化的一部分)将返回这四列中的每列的值(因此它被告知要查看的数据表(C1:F500)中的第 2、3、4 和 5 列,即 C、D、E 和 F 列)。
您甚至可以在输出中对它们进行重新排序,例如,{4,5,3,2}
按 E、F、D、C 的顺序返回列。
您还可以在第一个参数中使用数组常量。一种常见的方法是使用范围(例如 K1:K4)来查找四个值,因为它会在 Excel 解析公式时创建一个数组常量。不过,在每个单元格中输入相同的值仍会看到查找仅返回它找到的查找值的第一行的值,而不是前四次出现的值。但您可以直接键入数组常量,引用包含一个数组常量的单元格,等等,将其放入函数中。
但是您不能做的是在函数中使用多个数组常量(没有研究过这个,但它看起来像是“任何函数”,而不仅仅是这个特定的函数),并让 Excel 使用两者。它要么使用它遇到的第一个,要么使用它在函数参数中找到的第二个/第三个/等等中的第一个条目,或者直接出错。因此VLOOKUP({"horse","cow","pig",A1:F500,{2,3,4},FALSE)
将返回三列输出,马/牛/猪各一列,但每行的 B、C 和 D 列中只有一个列的单元格值。(要获得三行输出,您可以使用分号分隔符而不是上面的逗号(;
而不是,
分隔这些动物名称)。)
但VLOOKUP
绝对可以按照您的意愿提供任意多列的返回数据。(实际上,您甚至可以重复同一列:{2,3,2,2,2,4} 将为您提供六个输出单元格,其中查找表中的第 2 列出现四次。)
拒绝使用第二个(或更多)这样的数组常量的情况在相当多的其他函数中都发生过,这可能是极少数函数返回多行/多列结果的实际机制。XLOOKUP
例如。一列结果有 100,000 个单元格深,当然。一行结果有 12,000 列宽,当然。2x2 块...不行。
但是如果您手头有一个解决方案,只需要VLOOKUP
返回您想要的所有列而不是一列,那么这一小小的改变就会使它为您工作。
但是如果您了解 Power Query,或者愿意尝试它,那么它肯定是您想要的方法。