编写一个可以让excel填充和合并一组重复项中未填充字段的查询?

2ic8powd  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个联系人信息数据集(大),其中包含许多半重复的行,我想压缩成尽可能少的行。附件是我所谈论的一个示例。

左边的蓝色表格是我目前正在处理的较小比例的示例。右边的橙子表格是我希望表格看起来的样子。
我想编写一个查询,它能够选择一个具有多行的ID,并在该选择中评估值是否可以移动到具有未填充单元格的父行中(请参见ID“4”以及我如何通过填充空白和合并重复项将这三行数据压缩为一行)。
重点是如何执行此任务,而不是对整个工作表中的 * 所有 * 重复项执行一个总括语句。最终,我希望对整个工作表执行此任务,但我希望excel首先隔离一个ID,然后 * 执行上述任务,而不是基于 * 所有 * 重复ID来评估条件。((如果这有意义的话))
另一个我希望满足的条件是,对于同一ID下的多行具有不同值的某些列,将该数据分配到后续列中(请参见ID“1”下的Tags & Tags 2 columns),而不是覆盖单元格。

  • 我只想对2列^执行此操作;对于其他的,让它将它们保持为单独的行。

这听起来像是Power Query的一个任务,但是我在这个领域的知识是有限的。任何关于如何构造一个查询来完成这个任务的帮助都是非常感谢的。谢谢。

emeijp43

emeijp431#

这似乎工作正常

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Title", type text}, {"Company", type text}, {"Phone", type text}, {"Phone2", type any}, {"Street Address", type any}, {"City", type text}, {"Tags", type text}}),
// group, then unpivot, remove duplicates
#"Grouped Rows" = Table.Group(#"Changed Type", {"ID"}, {{"Data", each Table.Distinct(Table.UnpivotOtherColumns(_, {"ID"}, "Attribute", "Value"), {"Attribute", "Value"}), type table}}),
// combine all the tags into one cell for later splitting
#"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.Group([Data], {"ID", "Attribute"}, {{"Data", each Text.Combine([Value],","), type text}})),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Attribute", "Data"}, {"Attribute", "Data.1"}),
// replace null with Title to preserve rows with no data
#"Replaced Value" = Table.ReplaceValue(#"Expanded Custom",null,"Title",Replacer.ReplaceValue,{"Attribute"}),
#"Removed Columns" = Table.RemoveColumns(#"Replaced Value",{"Data"}),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Attribute]), "Attribute", "Data.1"),
// split the Tags column into any number of columns as needed
#"Replaced Value1" = Table.ReplaceValue(#"Pivoted Column",null,"xxx",Replacer.ReplaceValue,{"Tags"}),
DynamicColumnList  = List.Transform({1 ..List.Max(Table.AddColumn(#"Replaced Value1","Custom", each List.Count(Text.PositionOfAny([Tags],{","},Occurrence.All)))[Custom])+1}, each "Tags." & Text.From(_)),
#"Split Column by Delimiter" =  Table.SplitColumn(   #"Pivoted Column", "Tags",  Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), DynamicColumnList)
in  #"Split Column by Delimiter"
a1o7rhls

a1o7rhls2#

只需使用Table.Group函数就可以从Power Query获得所需的输出。
我假设:

  • 输出列仅如图所示
  • 输入列在Phone2Tags2中没有任何内容
  • 如果不是这种情况,可以进行简单的修改
  • 如果有比输出列更多的不同实体,则它们将在单个列中输出并置。
  • 换句话说,如果你有三个标签;第一个在Tags列中,第二个和第三个在Tags 2列中用逗号连接。
  • 我这样做是因为,由于您没有给出示例,我不太确定您希望如何排列,例如,如果您有多个电话和多个标记。
    ***注意:**如果要将其限制为仅一个ID,只需在开头插入一个筛选步骤 *
    • M代码**
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Title", type text}, {"Company", type text}, {"Phone", type text}, {"Phone2", type any}, {"Street Address", type text}, {"City", type text}, {"Tags", type text}, {"Tags2", type any}}),

//Group by ID then
//Depending on how many columns available in results table, will 
//either concatenate, multiple non-duplicate rows, or put them in separate columns
    #"Grouped Rows" = Table.Group(#"Changed Type", {"ID"}, {
        {"Title", each Text.Combine(List.Distinct([Title]),", ")},
        {"Company", each Text.Combine(List.Distinct([Company]),", ")},
        {"Phone", each try List.RemoveNulls([Phone]){0} otherwise null},
        {"Phone 2", each Text.Combine(List.RemoveFirstN(List.RemoveNulls(List.Distinct([Phone])),1),", ")},
        {"City", each Text.Combine(List.Distinct([City]),", ")},
        {"Tags", each try List.RemoveNulls([Tags]){0} otherwise null},
        {"Tags 2", each Text.Combine(List.RemoveFirstN(List.RemoveNulls(List.Distinct([Tags])),1),", ")}      
    })
in
    #"Grouped Rows"

相关问题