我有 2 张桌子
第一个表格是项目列表,另外 3 列表示选择层级
Items Choice 1 Choice 2 Choice 3
item1
item2
item3
item4
第二张表列出了用户及其商品选择。商品选择各不相同。
User Choice 1 Choice 2 Choice 3
user1 item3 item1 item2
user2 item1 item2 item4
user3 item4 item3 item2
我想根据用户的选择填充第一个表中的用户。在上述情况下,第一个表应按如下所示填充。
Items Choice 1 Choice 2 Choice 3
item1 user2 user1
item2 user2 user1 & user3
item3 user1 user3
item4 user3 user2
如果他们的选择与另一个用户共享,我将需要在一个单元格中拥有多个用户
答案1
在 Excel 2010+ 中,您可以使用 Power Query 从第二个表生成所需的表。
- 选择用户列并
Unpivot other columns
- 结果如下图所示:
- 然后选择属性列并以此为依据进行数据透视,高级选项为
Don't aggregate
- 但是,这将导致任何具有多个项目内容的单元格出现错误。
- 请注意
Choice 3
包含Item2
两个不同的用户 - 我们通过添加自定义聚合函数来解决这个问题,以连接结果(此选项在 UI 中不可用)
- 在高级编辑器或公式栏中,我们更改:
- 请注意
Table.Pivot(#"Unpivoted Other Columns", List.Distinct(#"Unpivoted Other Columns"[Attribute]), "Attribute", "User")
通过添加: each Text.Combine(List.Sort(_)," & ")
作为可选的聚合函数。
经过一些其他步骤,设置数据类型,删除多余的列,并重命名列Item
,最终使用的代码是:
M 代码
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"User", type text}, {"Choice 1", type text}, {"Choice 2", type text}, {"Choice 3", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"User"}, "Attribute", "Value"),
#"Pivoted Column" = Table.Pivot(#"Unpivoted Other Columns",
List.Distinct(#"Unpivoted Other Columns"[Attribute]),
"Attribute",
"User",
each Text.Combine(List.Sort(_)," & ")),
#"Renamed Columns" = Table.RenameColumns(#"Pivoted Column",{{"Value", "Item"}}),
#"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"Choice 1", type text}, {"Choice 2", type text}, {"Choice 3", type text}})
in
#"Changed Type1"
导致:
笔记:如果您决定将 M 代码粘贴到高级编辑器中,则需要确保第 2 行中的表名与工作簿中数据表的表名相同