Google 电子表格中的内部联接
INNER JOIN in Google Spreadsheets
我不知道或不记得我要查找的内容的技术名称,但我认为一个示例足以让您准确理解我要查找的内容。
给定 table A
a x1
b x2
c x1
和TableB
x1 x
x1 y
x1 z
x2 p
x2 z
我需要TableC
a x
a y
a z
b p
b z
c x
c y
c z
我正在寻找一个或一组公式来获得 table C
我想只需要在 C table 上添加一个额外的行,其中包含 [=45= 上第一列的每个值] A 对于 TableA!Column2 到 TableB!Column1[ 的每个对应值=36=] 但是我找不到如何
我认为这是一个简单的SQL内连接。
尝试:
=ARRAYFORMULA({TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))), IFNA(VLOOKUP(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦")))&COUNTIFS(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))),
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))), ROW(INDIRECT("O1:O"&COUNTA(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦")))))), "<="&ROW(INDIRECT("O1:O"&COUNTA(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))))))),
{D2:D&COUNTIFS(D2:D, D2:D, ROW(O2:O), "<="&ROW(O2:O)), E2:E}, 2, 0))})
Las 答案不适用于 TableA!column1 上的重复项。
显示关键公式的说明:
只需添加一个中间列
JOIN(",",FILTER(E:E,D:D=L2))
所以你可以从他们那里获取数据
INDEX(TRANSPOSE(SPLIT(JOIN(",",FILTER(M:M,K:K=O2)),",")),COUNTIF(O:O1,"="&O2)+1)
成多列
ArrayFormula(TRIM(FLATTEN(SPLIT(QUERY(REPT(IF(A2:A="",,A2:A&"♦"), IFNA(VLOOKUP(B2:B, QUERY({D2:D}, "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))))
here is an example 和一张图片。
您尝试做的是 SQL 中的 JOIN,它会复制值。 Inner, left, right or full 定义了两边都没有匹配项时的行为。
我能想到的最简单的方法是使用 Google Apps Script 创建一个自定义函数以在公式中使用:
function JOINRANGES(range1, index1, range2, index2) {
const result = []
for(let row1 of range1) {
for (let row2 of range2) {
if (row1[index1] == row2[index2]) {
const r = [...row1, ...row2]
// Remove the keys themselves
r.splice(row1.length+index2, 1)
r.splice(index1, 1)
result.push(r)
}
}
}
return result
}
然后您可以在左上列的工作表公式中使用它:
=ARRAYFORMULA(JOINRANGES(A1:B3, 1, D1:E6, 0))
第一个和第三个参数是范围,第二个和第四个参数是范围内列的索引(从0开始)。
最终结果:
如果您不了解 Google Apps 脚本,the about page in the google-apps-script
tag 有很多非常有用的指南和文档。
我不知道或不记得我要查找的内容的技术名称,但我认为一个示例足以让您准确理解我要查找的内容。
给定 table A
a x1
b x2
c x1
和TableB
x1 x
x1 y
x1 z
x2 p
x2 z
我需要TableC
a x
a y
a z
b p
b z
c x
c y
c z
我正在寻找一个或一组公式来获得 table C
我想只需要在 C table 上添加一个额外的行,其中包含 [=45= 上第一列的每个值] A 对于 TableA!Column2 到 TableB!Column1[ 的每个对应值=36=] 但是我找不到如何
我认为这是一个简单的SQL内连接。
尝试:
=ARRAYFORMULA({TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))), IFNA(VLOOKUP(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦")))&COUNTIFS(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))),
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))), ROW(INDIRECT("O1:O"&COUNTA(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦")))))), "<="&ROW(INDIRECT("O1:O"&COUNTA(
TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D},
"select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))))))),
{D2:D&COUNTIFS(D2:D, D2:D, ROW(O2:O), "<="&ROW(O2:O)), E2:E}, 2, 0))})
Las 答案不适用于 TableA!column1 上的重复项。 显示关键公式的说明:
只需添加一个中间列
JOIN(",",FILTER(E:E,D:D=L2))
所以你可以从他们那里获取数据
INDEX(TRANSPOSE(SPLIT(JOIN(",",FILTER(M:M,K:K=O2)),",")),COUNTIF(O:O1,"="&O2)+1)
成多列
ArrayFormula(TRIM(FLATTEN(SPLIT(QUERY(REPT(IF(A2:A="",,A2:A&"♦"), IFNA(VLOOKUP(B2:B, QUERY({D2:D}, "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))))
here is an example 和一张图片。
您尝试做的是 SQL 中的 JOIN,它会复制值。 Inner, left, right or full 定义了两边都没有匹配项时的行为。
我能想到的最简单的方法是使用 Google Apps Script 创建一个自定义函数以在公式中使用:
function JOINRANGES(range1, index1, range2, index2) {
const result = []
for(let row1 of range1) {
for (let row2 of range2) {
if (row1[index1] == row2[index2]) {
const r = [...row1, ...row2]
// Remove the keys themselves
r.splice(row1.length+index2, 1)
r.splice(index1, 1)
result.push(r)
}
}
}
return result
}
然后您可以在左上列的工作表公式中使用它:
=ARRAYFORMULA(JOINRANGES(A1:B3, 1, D1:E6, 0))
第一个和第三个参数是范围,第二个和第四个参数是范围内列的索引(从0开始)。
最终结果:
如果您不了解 Google Apps 脚本,the about page in the google-apps-script
tag 有很多非常有用的指南和文档。