79

这个问题是关于使用 =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 函数并将其粘贴下来,但我的数据集很大。我需要一整页的 vlookups 和谷歌电子表格告诉我在我的复杂性极限。

我查看了 Google 的查询语言参考……似乎没有提到一种“加入”函数。你会认为这将是一个简单的“加入 A”类型的操作。

任何人都可以在没有 vlookup 的情况下解决这个问题吗?

4

6 回答 6

62

简短的回答

Google QUERY 语言版本 0.7 (2016) 不包含 JOIN (LEFT JOIN) 运算符,但这可以通过使用数组公式来实现,其结果可用作 QUERY 函数的输入或其他用途。

解释

数组公式和Google 表格的数组处理功能可以在两个简单的表之间进行 JOIN。为了更易于阅读,建议的公式使用命名范围而不是范围引用。

命名范围

  • 表 1:工作表 1!A1:C3
  • 表2:Sheet2!A1:C3
  • 编号:Sheet1!A1:A3

公式

=数组公式(
   {
     表格1,
     vlookup(ID,table2,COLUMN(间接("R1C2:R1C"&COLUMNS(table2),0)),0)
   }
)

评论:

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

例子

有关示例,请参见此表

笔记

2017年谷歌对QUERY、QUERY函数的英文官方帮助文章进行了改进。它仍然不包括这样的主题,但可能有助于理解它是如何工作的。

于 2016-03-25T04:42:35.447 回答
18

您可以使用ARRAYFORMULA或直接拖动此公式:在导入或QUERY-ing 第一个表之后;在 D 列中:

=QUERY(Sheet2!A1:C3, "Select B,C WHERE A='" & A1 & "'", 0)
于 2014-06-11T02:31:43.567 回答
14

因此,这回答了您如何使用 Vlookup 功能进行操作,但仅在一个单元格中。
在您的示例中,假设每个数据表都具有以下单元格引用:

表 1:Sheet1!A1:C3

a d g
b e h
c f i

表 2:Sheet2!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 中使用大括号。您基本上将 Range 的第一个单元格引用定义为与 Vlookup Search_Key 匹配的列。范围中的其余单元格引用与您要加入的列有关。

Index 写成 {2,3} 以返回 Range 的第二列和第三列(Range 总共由 3 列组成);大括号与 Vlookup 索引中的 Arrayformula 无关,但对于从 Vlookup 函数返回多列是必需的。不写 {1,2,3} 的原因是您不想包含用于加入目的的列。

table2 中用于连接的列位于不同列中的示例(在要连接的数据的右侧)

即使第二个表中的连接列位于该表的第三列,也可以使用这种连接公式。假设此示例中的原始数据如下所示:

表 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-formula 中,注意 Table2 的第三列位于 Vlookup Range 中的第一个单元格引用!
这样做的原因是,当您在 Range 中使用大括号(与 Arrayformula 一起使用)时,Vlookup Search_Key 不会在原始数据中查找列作为公分母,而是使用其中的 Array花括号作为参考来查找作为公分母的列(默认情况下,这是 Range 的第一列)。

我写了一个关于这个主题的综合指南,叫做:

“掌握 Google 表格中的联接公式”

于 2019-03-17T16:57:49.960 回答
1

我通过使用 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

于 2020-04-16T04:59:35.403 回答
1

如果您可以将每个“索引”(a、b、c)映射到特定的行或列,那么您可以使用该INDEX函数。

在这种情况下,您可以将“a”映射到 A 列(或第 1 行),将“b”映射到 B 列(或第 2 行),依此类推。

此外,合并表似乎解决了这个确切的用例。

于 2017-01-17T18:56:59.850 回答
0

使用 A5:C7 中的“其他”表,请尝试:

=query({A1:C3,query(sort(A5:C7,1,TRUE),"Select Col2,Col3")})
于 2018-01-15T02:37:58.563 回答