谷歌电子表格"=QUERY" join()等效函数?



这个问题是关于使用=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})

备注:

  • 使用开放式范围是可能的,但这可能会使电子表格的速度变慢
  • 要加快重新计算时间:
  1. 用从2到表2的列数的常量数组替换Indirect("R1C2:R1C"&COLUMNS(table2),0)
  2. 从电子表格中删除空行

示例

示例请参见此表

备注

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")})

相关内容

  • 没有找到相关文章

最新更新