Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将表格与Excel Power Query相结合_Excel_Powerquery - Fatal编程技术网

将表格与Excel Power Query相结合

将表格与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

我希望在权力查询中实现这一点。我有大约50张桌子要合并。我想基于列键合并表。问题是有些表包含重复的键(本例中为电子邮件),但表1缺少表2中的值,反之亦然。此外,表2可能缺少一些列或有一个附加列。对其他建议也持开放态度。也许是VBA

例如:

表1:

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
      中所做的那样,将数据类型指定为每列的文本可能很重要
  • Group
    by
    email
  • 使用List.Accumulate提取非空项的自定义聚合。
    • 请注意,如果来自不同表的同一列中的项不相同,则可以修改聚合公式以连接这些项
M代码

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
    函数返回的分组项的子表

  • 虽然不是在这个论坛上,但是有一个很好的解释
    列表累积