这个问题是关于使用=QUERY函数连接Google电子表格中的两个数据库
我有一张这样的表,范围为A1:C3
a d g
b e h
c f i
我有另一张桌子
c j m
a k n
b l o
我希望最后的表格看起来像这个
a d g k n
b e h l o
c f i j m
我可以很容易地在单元格D1中使用vlookup函数,并将其向下粘贴,但我的数据集非常庞大。我需要一整页的vlookup,谷歌电子表格告诉我的复杂性已经到了极限。
我看了谷歌的查询语言参考。。。似乎没有提到一种类型的"联接"函数。你可能会认为这是一个简单的"加入A"类型的操作。
有人能在没有vlookup的情况下解决这个问题吗?
简短回答
Google QUERY Language版本0.7(2016)不包括JOIN(LEFT JOIN)运算符,但这可以通过使用数组公式来实现,该公式的结果可以用作QUERY函数的输入或用于其他用途。
解释
数组公式和GoogleSheets的数组处理功能使得在两个简单的表之间进行JOIN成为可能。为了便于阅读,所提出的公式使用命名范围而不是范围引用。
命名范围
- 表1:表1!A1:C3
- 表2:表2!A1:C3
- ID:Sheet1!A1:A3
公式
=排列公式({表1,vlookup(ID,表2,COLUMN(间接("R1C2:R1C"和COLUMNS(表2),0)),0})
备注:
- 使用开放式范围是可能的,但这可能会使电子表格的速度变慢
- 要加快重新计算时间:
- 用从2到表2的列数的常量数组替换
Indirect("R1C2:R1C"&COLUMNS(table2),0)
- 从电子表格中删除空行
示例
示例请参见此表
备注
2017年,谷歌改进了关于QUERY的英文官方帮助文章,QUERY功能。它还没有包括这样的主题,但可能有助于了解它是如何工作的。
因此,这回答了如何使用Vlookup函数,但仅在一个单元格中执行此操作
在您的示例中,假设每个数据表都有以下单元格引用:
表1:表1!A1:C3
a d g
b e h
c f i
表2:表2!A1:C3
c j m
a k n
b l o
这就是公式的构造方式。
加入公式
=ArrayFormula(
{
Sheet1!A1:C,
vlookup(Sheet1!A1:A, {Sheet2!A1:A, Sheet2!B1:C}, {2,3}, false)
}
)
让这个公式发挥作用的关键是了解如何在Vlookup范围中使用花括号。基本上将Range的第一个单元格引用定义为与Vlookup Search_Key匹配的列。"范围"中的其余单元格引用与要联接的列有关。
Index被写成{2,3},以返回Range的第二列和第三列(Range总共由3列组成);花括号与Vlookup索引中的Arrayformula无关,但对于从Vlookup函数返回多个列是必需的。不写入{1,2,3}的原因是,您不希望包含用于联接的列。
表2中用于联接的列位于不同列中的示例(在要联接的数据的右侧)
即使第二个表中的联接列位于该表的第三列,也可以使用这种联接公式。假设本例中的原始数据如下所示:
表1(表1):
a d g
b e h
c f i
表2(表2):
j m c
k n a
l o b
如果你这样写公式,你仍然会得到想要的结果(如连接数据表中所示):
=ArrayFormula(
{
Sheet1!A1:C,
vlookup(Sheet1!A1:A, {Sheet2!C1:C, Sheet2!A1:B}, {2,3}, false)
}
)
联接数据表:
a d g k n
b e h l o
c f i j m
在Join公式中,请注意Table2的第三列位于Vlookup Range中的第一个单元格引用
这之所以有效,是因为当您在Range中使用花括号(与Arrayformula一起使用)时,Vlookup Search_Key将不会在原始数据中查找作为公分母的列,而是使用花括号中的Array作为引用,以查找作为公分分母的列(默认情况下,这是Range的第一列)。
我写了一本关于这个主题的综合指南,名为:
'Mastering Join formula in Google Sheets'
您可以使用ARRAYFORMULA
,也可以拖动此公式:在对第一个表进行导入或QUERY
之后;在D列中:
=QUERY(Sheet2!A1:C3, "Select B,C WHERE A='" & A1 & "'", 0)
我使用Javascript LINQ(语言集成查询)解决了这个问题。
它允许您指定具有复杂联接条件的Javascript。您还可以执行其他SQL查询,如对工作表进行分组、投影、排序和筛选,就好像它们是数据库表一样。查看下面的链接。
注意,在LINQ查询语言中,我用下划线替换了列名中的所有空格,使它们成为有效的JS标识符。
https://docs.google.com/spreadsheets/d/1DHtQlQUlo-X_YVfo-Wo-b7315sSk2pxL5ci4Y9lxvZo/edit?usp=sharing
https://script.google.com/d/1R5L2ReHJrBRwyoSoVOFLzEQZiGtxidPfPkAeVownt7SWX6TpacY7gA7j/edit?usp=sharing
如果您可以将每个"索引"(a、b、c)映射到特定的行或列,那么您可以使用INDEX
函数。
在这种情况下,您可能会将"a"映射到列a(或第1行),将"b"映射到b(或第2行),依此类推
此外,合并表似乎正好解决了这个用例。
使用A5:C7中的"其他"表,请尝试:
=query({A1:C3,query(sort(A5:C7,1,TRUE),"Select Col2,Col3")})