将表格与Excel Power Query相结合
我希望在权力查询中实现这一点。我有大约50张桌子要合并。我想基于列键合并表。问题是有些表包含重复的键(本例中为电子邮件),但表1缺少表2中的值,反之亦然。此外,表2可能缺少一些列或有一个附加列。对其他建议也持开放态度。也许是VBA 例如: 表1:将表格与Excel Power Query相结合,excel,powerquery,Excel,Powerquery,我希望在权力查询中实现这一点。我有大约50张桌子要合并。我想基于列键合并表。问题是有些表包含重复的键(本例中为电子邮件),但表1缺少表2中的值,反之亦然。此外,表2可能缺少一些列或有一个附加列。对其他建议也持开放态度。也许是VBA 例如: 表1: Email | First | Last | Phone | 123@mail John 555-555 234@mail Timothy Smith 123-456 456@mail J
Email | First | Last | Phone |
123@mail John 555-555
234@mail Timothy Smith 123-456
456@mail Jim 123-456
Email | First | Last | Phone | Location
123@mail Doe Toronto
234@mail Timothy Smith 123-456 Denver
456@mail Jim Barley 123-456 Cleveland
Email | First | Last | Phone | Location
123@mail John Doe 555-555 Toronto
234@mail Timothy Smith 123-456 Denver
456@mail Jim Barley 123-456 Cleveland
表2:
Email | First | Last | Phone |
123@mail John 555-555
234@mail Timothy Smith 123-456
456@mail Jim 123-456
Email | First | Last | Phone | Location
123@mail Doe Toronto
234@mail Timothy Smith 123-456 Denver
456@mail Jim Barley 123-456 Cleveland
Email | First | Last | Phone | Location
123@mail John Doe 555-555 Toronto
234@mail Timothy Smith 123-456 Denver
456@mail Jim Barley 123-456 Cleveland
结果:
Email | First | Last | Phone |
123@mail John 555-555
234@mail Timothy Smith 123-456
456@mail Jim 123-456
Email | First | Last | Phone | Location
123@mail Doe Toronto
234@mail Timothy Smith 123-456 Denver
456@mail Jim Barley 123-456 Cleveland
Email | First | Last | Phone | Location
123@mail John Doe 555-555 Toronto
234@mail Timothy Smith 123-456 Denver
456@mail Jim Barley 123-456 Cleveland
使用Power Query,您可以执行NestedJoin或合并操作。 无论哪种方式,您都必须从相应的表中提取缺少的条目 在下面的例子中
表格。合并
- 请注意,Table.Combine参数是一个表列表,因此可以组合两个以上的表
- 检查第2-5行,了解我是如何从工作簿访问表的
- 第2-3行由电源查询界面生成
- 第4-5行由我手动输入,以显示指定列数据类型的不同方法
- 如果要为同一封电子邮件聚合不同的条目,那么像我在
中所做的那样,将数据类型指定为每列的文本可能很重要表2
byGroup
email
- 使用List.Accumulate提取非空项的自定义聚合。
- 请注意,如果来自不同表的同一列中的项不相同,则可以修改聚合公式以连接这些项
let
Source = Excel.CurrentWorkbook(){[Name="Table_1"]}[Content],
tbl1 = Table.TransformColumnTypes(Source,{{"Email", type text}, {"First", type text}, {"Last", type text}, {"Phone", type text}}),
Source2 = Excel.CurrentWorkbook(){[Name="Table_2"]}[Content],
tbl2 = Table.TransformColumnTypes(Source2,List.Zip({Table.ColumnNames(Source2), List.Repeat({type text}, List.Count(Table.ColumnNames(Source2)))})),
comb = Table.Combine({tbl1,tbl2}),
#"Grouped Rows" = Table.Group(comb, {"Email"}, {
//Below are the custom formulas for each column
{"First", each List.Accumulate(_[First],"",(state, current) => if state = "" and current <> null then current else state), type text},
{"Last", each List.Accumulate(_[Last],"",(state, current) => if state = "" and current <> null then current else state), type text},
{"Phone", each List.Accumulate(_[Phone],"",(state, current) => if state = "" and current <> null then current else state), type text},
{"Location", each List.Accumulate(_[Location],"",(state, current) => if state = "" and current <> null then current else state), type text}
})
in
#"Grouped Rows"
let
Source=Excel.CurrentWorkbook(){[Name=“Table_1”]}[Content],
tbl1=Table.TransformColumnTypes(源代码,{{“Email”,键入text},{“First”,键入text},{“Last”,键入text},{“Phone”,键入text}),
Source2=Excel.CurrentWorkbook(){[Name=“Table_2”]}[Content],
tbl2=Table.TransformColumnTypes(Source2,List.Zip({Table.ColumnNames(Source2),List.Repeat({type text},List.Count(Table.ColumnNames(Source2)))}),
comb=Table.Combine({tbl1,tbl2}),
#“分组行”=Table.Group(comb,{“Email”}{
//下面是每列的自定义公式
{“First”,每个列表。累加({[First],“”,(state,current)=>if state=“”和current null,然后是current else state),键入text},
{“Last”,每个列表。累加({[Last],“”,(state,current)=>if state=“”和current null,然后是current else state),键入text},
{“Phone”,每个列表。累加({[Phone],“”,(state,current)=>if state=”“和current null,然后是current else state),键入text},
{“位置”,每个列表。累加({[Location],“”,(state,current)=>if state=“”和current null,然后是current else state),键入text}
})
在里面
#“分组行”
聚合功能
- 这将返回指定列的组合列表中的第一个非空项
每个列表。累加(u[列标题],“”,(状态,当前)=>如果状态为“”,当前为null,则当前为else状态)
(以及后续的每个
)都是指由
函数返回的分组项的子表表.Group
- 虽然不是在这个论坛上,但是有一个很好的解释
列表累积