如何进行全外连接?
How to do a full outer join?
我正在尝试在两个不同的 sheet 中对以下数据进行完全连接。
Sheet 9:
Product ID
Name
Quantity
1
addi
55
2
fadi
66
3
sadi
33
Sheet10
Product ID
Variants
Model
1
xyz
2000
2
differ
2001
3
saddd
336
4
fsdfe
2005
期望的输出 sheet :
Product ID
Name
Quantity
Variants
Model
1
addi
55
xyz
2000
2
fadi
66
differ
2001
3
sadi
33
saddd
336
4
fsdfe
2005
如果我们有更多列要加入,如 sheet 1 和 sheet 2 中还有两列,如年份、产品标签等,也请分享,那么我应该在你提出的解决方案中更改什么
我正在使用这个公式,但它没有返回所需的结果
=ARRAYFORMULA({QUERY(SORT(UNIQUE({Sheet9!A1:D; Sheet10!A1:D})), "where Col1 is not null"),IFERROR(VLOOKUP(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SORT(UNIQUE({Sheet9!A1:D; Sheet10!A1:D})), "where Col1 is not null")),,999^99)), TRANSPOSE(QUERY(TRANSPOSE(Sheet9!A1:D),,999^99)), Sheet9!C1:C}, 2, 0),""),IFERROR(VLOOKUP(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SORT(UNIQUE({Sheet9!A1:D; Sheet10!A1:D})), "where Col1 is not null")),,999^99)), {TRANSPOSE(QUERY(TRANSPOSE(Sheet10!A1:D),,999^99)), Sheet10!C1:C}, 2, 0),"")}})
已编辑以考虑动态行匹配。
See this spreadsheet 进行说明,但总的来说您的设置存在问题,但我会将您的问题分为两个步骤。
获取不同的 ID 列表
你可以用这个公式得到:
=unique(transpose(split(textjoin(",",true,
iferror(INdex(Sheet2!$A:$Z,0,MATCH(A1,Sheet2!1:1,0)),""),
iferror(INdex(Sheet1!$A:$Z,0,MATCH(A1,Sheet1!1:1,0)),"")),",")))
其余 Headers
那么对于每个 header,它们是否总是只在 1 个或 2 个(不是两者)中?假设是这样,这应该适用于每个额外的列。如果两个值曾经存在于两个工作表中,则将它们连接到同一列中。
=filter(
iferror(VLOOKUP($A:$A,Sheet1!$A:$Z,match(E,Sheet1!1:1,0),false),"")
&iferror(VLOOKUP($A:$A,Sheet2!$A:$Z,match(E,Sheet2!1:1,0),false),"")
,$A:$A<>"")
可能有一种方法可以使用 join 函数更优雅地完成此操作(如果有人发布了一个答案,我会投票支持)。
我正在尝试在两个不同的 sheet 中对以下数据进行完全连接。
Sheet 9:
Product ID | Name | Quantity |
---|---|---|
1 | addi | 55 |
2 | fadi | 66 |
3 | sadi | 33 |
Sheet10
Product ID | Variants | Model |
---|---|---|
1 | xyz | 2000 |
2 | differ | 2001 |
3 | saddd | 336 |
4 | fsdfe | 2005 |
期望的输出 sheet :
Product ID | Name | Quantity | Variants | Model |
---|---|---|---|---|
1 | addi | 55 | xyz | 2000 |
2 | fadi | 66 | differ | 2001 |
3 | sadi | 33 | saddd | 336 |
4 | fsdfe | 2005 |
如果我们有更多列要加入,如 sheet 1 和 sheet 2 中还有两列,如年份、产品标签等,也请分享,那么我应该在你提出的解决方案中更改什么
我正在使用这个公式,但它没有返回所需的结果
=ARRAYFORMULA({QUERY(SORT(UNIQUE({Sheet9!A1:D; Sheet10!A1:D})), "where Col1 is not null"),IFERROR(VLOOKUP(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SORT(UNIQUE({Sheet9!A1:D; Sheet10!A1:D})), "where Col1 is not null")),,999^99)), TRANSPOSE(QUERY(TRANSPOSE(Sheet9!A1:D),,999^99)), Sheet9!C1:C}, 2, 0),""),IFERROR(VLOOKUP(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SORT(UNIQUE({Sheet9!A1:D; Sheet10!A1:D})), "where Col1 is not null")),,999^99)), {TRANSPOSE(QUERY(TRANSPOSE(Sheet10!A1:D),,999^99)), Sheet10!C1:C}, 2, 0),"")}})
已编辑以考虑动态行匹配。
See this spreadsheet 进行说明,但总的来说您的设置存在问题,但我会将您的问题分为两个步骤。
获取不同的 ID 列表
你可以用这个公式得到:
=unique(transpose(split(textjoin(",",true,
iferror(INdex(Sheet2!$A:$Z,0,MATCH(A1,Sheet2!1:1,0)),""),
iferror(INdex(Sheet1!$A:$Z,0,MATCH(A1,Sheet1!1:1,0)),"")),",")))
其余 Headers
那么对于每个 header,它们是否总是只在 1 个或 2 个(不是两者)中?假设是这样,这应该适用于每个额外的列。如果两个值曾经存在于两个工作表中,则将它们连接到同一列中。
=filter(
iferror(VLOOKUP($A:$A,Sheet1!$A:$Z,match(E,Sheet1!1:1,0),false),"")
&iferror(VLOOKUP($A:$A,Sheet2!$A:$Z,match(E,Sheet2!1:1,0),false),"")
,$A:$A<>"")
可能有一种方法可以使用 join 函数更优雅地完成此操作(如果有人发布了一个答案,我会投票支持)。