将多行合并为一行(多对多关系)

将多行合并为一行(多对多关系)

有人能帮我写一个 Excel 公式来执行以下操作吗?我正在尝试从平面文件摘录中合并客户的产品代码。每个客户可以有多个产品,反之亦然(这是一个多对多关系)。我需要的是生成一个单独的工作表,其中包含以逗号分隔的简单客户和相关产品列表。查看图片以了解我正在尝试做什么:

https://i.stack.imgur.com/QJgsK.jpg

答案1

如果您愿意创建几个“辅助列”,这会容易得多。最简单的方法是将它们放在 Sheet 1 上(您可以隐藏它们,或将它们放在右侧很远的地方(例如,列YZ),如果您愿意的话 — 或者您甚至可以将它们放在另一张表上。我假设我们使用列YZ作为辅助列,“客户 ID”和“产品 ID”分别位于列A和中B,数据从第 2 行开始(标题在第 1 行中)。

输入以下值和公式:

  • Y20
  • Y3=IF(A3=A4, Y2, Y2+1)
  • Z2=IF(A1=A2, Z1 & ", " & B2, B2)

向下拖动/填充Y3数据。您应该得到如下结果:Z2

Y标识单个客户的行范围。如果下一行的客户 ID 与此行不同(即,如果这是此客户的最后一行),我们将上一个Y值(即上面的行)加 1。否则,复制上一个值。

Z构建每个客户的产品列表。如果前一行的客户编号与这一行相同,则意味着当前行不是该客户的第一行,因此我们从上一行获取值Z并从这一行附加产品。否则,这该客户的第一行,所以我们只需从这一行中取出产品即可。(如果您按相反的顺序阅读前两句话,可能会更有意义。)

现在,转到 Sheet2。与之前相同;我假设“客户 ID”和“产品”分别位于列AB中,数据从第 2 行开始(标题在第 1 行)。输入以下公式:

  • A2=INDEX(Sheet1!A:A, MATCH(ROW()-1, Sheet1!Y:Y, 0))
  • B2=INDEX(Sheet1!Z:Z, MATCH(ROW()-1, Sheet1!Y:Y, 0))

并向下拖动/填充。

请注意,这两个公式有一个共同的表达式: MATCH(ROW()-1, Sheet1!Y:Y, 0)。该表达式查找 Sheet1 上的第一行,其Y值为当前(Sheet2)行号减 1。因此,Sheet2 的第 2 行查找 1,Sheet2 的第 3 行查找 2,等等。请记住,Sheet1!Y对于客户,最后一行的值会增加 1。因此,Column 中的公式A提取Sheet1!A该行的值,即下一个唯一客户 ID,Column 中的公式B提取Sheet1!Z该行的值,即该客户的产品列表:

            

答案2

虽然需要进行一些调整,但经过反复尝试后,它终于可以合并两个包含“一些”不同数据的相同电子表格。每个电子表格都超过 15,000 行和 132 列!随机抽查都很好!这为我节省了大量时间,谢谢!

相关内容