如何压缩/合并在 A 列中共享相同值的表,并将所有数据附加到最后一行

如何压缩/合并在 A 列中共享相同值的表,并将所有数据附加到最后一行

我正在尝试找到一种方法原始表变得更加压缩表。我的 A 列始终包含“公司名称”,后面是联系人信息列表。这个问题是对于每个联系人,它最终都会创建一个新行。因此单个“公司名称”可能会重复 4 次。

A 列是公司名称 B 列是个人姓名 C 列是电话

 - If column A "Corp Name" is the same as the one right above it

 - then move the next three cells and append cells to the end

 - else skip to next row

是否有捷径可寻?

答案1

这看起来是 Power Query 的完美案例。因此,您必须运行 Excel 2010+,而不是 Excel for Mac。

我们将您的原始表称为 Table1。根据您提供的屏幕截图,它似乎已经是一个带有标题的 Excel 表。要使用 Power Query,您需要将该表带入查询编辑器。单击表格内的任意位置,然后转到“数据”选项卡并选择“获取和转换数据”下的“来自表/范围”。 导航至 Power Query

这将打开 Power Query 编辑器。 在此处输入图片描述

我将首先逐步介绍如何实施下面的解决方案,然后向您介绍其工作原理。如果您有兴趣了解创建它的步骤,请发表评论,我可以回过头来提供更多详细信息。现在我介绍的是完成的解决方案。

首先将右侧查询设置中的 Table1 重命名为 Table2。这样可以更轻松地将其重新加载到工作表中。

接下来,单击“主页”选项卡中的“高级编辑器”:

在此处输入图片描述

现在选择现有脚本并将该脚本粘贴到其上:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Corp Name", type text}, {"persons name", type text}, {"position", type text}, {"Phone", type text}}),
   // get a count of how many rows are assigned to each Corp & merge this with the orginal Table1 (with changed types)
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Corp Name"}, {{"Count", each Table.RowCount(_), Int64.Type}}),
    #"Merged Queries" = Table.NestedJoin(#"Grouped Rows", {"Corp Name"}, #"Changed Type", {"Corp Name"}, "Grouped Rows", JoinKind.LeftOuter),
   // expand it out except for Corp Name, so that the Count of rows is now part of the Table2
    #"Expanded Grouped Rows" = Table.ExpandTableColumn(#"Merged Queries", "Grouped Rows", {"persons name", "position", "Phone"}, {"persons name", "position", "Phone"}),
   // unpiv the columns you want to replicate - there are three and that is important, so I will make it a variable in the script
    columnsToUnpiv = 3,
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Expanded Grouped Rows", {"Corp Name", "Count"}, "Attribute", "Value"),
   // now add an index that will modulated and then used to assign field names - Must be started from zero because of modulation
    #"Added Index" = Table.AddIndexColumn(#"Unpivoted Columns", "Index", 0, 1, Int64.Type),
   // now divide it by the number of columns that you are unpivoting, so that it puts the same number next to each field that is part of the same row in Table1
    #"Integer-Divided Column" = Table.TransformColumns(#"Added Index", {{"Index", each Number.IntegerDivide(_, columnsToUnpiv), Int64.Type}}),
   // now, use the Count to create an index for each field in Table1 then add 1 to align to the target table numeration
    #"Inserted Modulo" = Table.AddColumn(#"Integer-Divided Column", "Modulo", each Number.Mod([Index], [Count]), type number),
    #"Added to Column" = Table.TransformColumns(#"Inserted Modulo", {{"Modulo", each _ + 1, type number}}),
   // now concatenate the Attribute which contains the field name to the Modulo index then clean out the 1's because your example did not want that and get rid of the helper columns
    #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Added to Column", {{"Modulo", type text}}, "en-GB"),{"Attribute", "Modulo"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"Merged"),
    #"Replaced Value" = Table.ReplaceValue(#"Merged Columns","1","",Replacer.ReplaceText,{"Merged"}),
    #"Removed Columns" = Table.RemoveColumns(#"Replaced Value",{"Count", "Index"}),
   // now Pivot it back into the shape you wanted
    #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Merged]), "Merged", "Value")
in
    #"Pivoted Column"

然后,您可以选择“关闭”和“加载到”,并选择要放置包含所需结果的 Table2 的位置。以下是输出示例:

在此处输入图片描述

您可以复制/粘贴上面的 Power Query(M 语言)脚本,但如果您实际上要展平超过 3 列数据,则必须为此目的构建上面的脚本。请注意以下行:“列到非piv = 3,“:这是一条关键的线。如果您要执行的操作超过 3,则需要更改此行以反映要展平的列数。

但这不是唯一需要更改的内容。如果您的字段名称与示例不同,则脚本必须遵循该名称。因此,最好逐步重建上述脚本。不幸的是,Power Query 中的自动脚本编写需要进行一些修改才能获得您想要的结果。因此,下面是上述解决方案如何创建的概述:

  1. 使用“数据”选项卡下的“表/范围”导入表格
  2. 在 Power Query 编辑器中,选择公司名称点击“分组依据”在“主页”选项卡中。
  3. 现在点击合并查询从主页选项卡中选择表2。 点击公司名称在上表和下表中单击并确定。这将生成一行脚本,您必须手动编辑该脚本。您需要替换此脚本:

= Table.NestedJoin(#"分组行", {"公司名称"},#“分组行”, {"公司名称"}, "分组行", JoinKind.LeftOuter)

有了这个:

= Table.NestedJoin(#"分组行", {"公司名称"},#“改变类型”, {"公司名称"}, "分组行", JoinKind.LeftOuter)

  1. 现在扩张分组行. 取消选择公司名称。
  2. 选择公司名称数数然后选择逆透视其他列在“变换”选项卡中。
  3. 选择添加索引开始从 0,在“添加列”选项卡下。
  4. 选择指数列并选择整数除法在里面标准变换选项卡下的下拉菜单。除以您想要取消透视的列数 - 在您的示例中,这是 3。
  5. 在添加列选项卡中,选择模数在里面标准下拉列表。选择使用列中的值并选择数数

在此处输入图片描述

  1. 单击模数列,然后选择添加在里面标准变换选项卡下的下拉菜单。
  2. 点击属性列,然后模数列(按顺序),然​​后选择合并列在“变换”选项卡中。
  3. 现在点击已合并列并选择替换值在“变换”选项卡中将 1 替换为“”,然后单击“确定”。
  4. 点击数数指数,然后按 DELETE 键将其删除。
  5. 现在点击已合并并选择逆透视在“转换”选项卡中选择价值不要聚集然后单击“确定”。
  6. 选择关闭并加载并决定保存 Table2 的位置。

你完成了。

相关内容