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

jas*_*son 56 sql google-sheets google-query-language

此问题涉及使用= QUERY函数在Google电子表格中加入两个数据库

我在A1:C3范围内有一张这样的桌子

a d g
b e h
c f i
Run Code Online (Sandbox Code Playgroud)

我有另一张桌子

c j m
a k n
b l o
Run Code Online (Sandbox Code Playgroud)

我希望决赛桌看起来像这样

a d g k n
b e h l o 
c f i j m
Run Code Online (Sandbox Code Playgroud)

我可以通过在单元格D1中非常容易地使用vlookup函数并将其粘贴到其中来实现此目的,但我的数据集非常庞大.我需要一整页的vlookups和Google Spreadsheet告诉我我的复杂性极限.

我查看了谷歌的查询语言参考...似乎没有提到一种类型的"加入"功能.你会认为这将是一个简单的"加入A"类型的操作.

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

Rub*_*bén 37

简短的回答

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

说明

数组公式和Google表格数组处理功能使得在两个简单表之间建立联接成为可能.为了便于阅读,建议的公式使用命名范围而不是范围引用.

命名范围

  • table1:Sheet1!A1:C3
  • table2:Sheet2!A1:C3
  • ID:Sheet1!A1:A3

=ArrayFormula(
   {
     table1,
     vlookup(ID,table2,COLUMN(Indirect("R1C2:R1C"&COLUMNS(table2),0)),0)
   }
)

备注:

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

请参阅此表以获取示例

注意

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

  • 目前,这是唯一一个实际适用于大型数据集但没有在每个单元格中粘贴公式的答案.这真的很有帮助.谢谢! (2认同)

Whi*_*ing 16

您可以使用ARRAYFORMULA或者您只需拖动此公式:导入或QUERY第一个表后; 在D栏中:

=QUERY(Sheet2!A1:C3, "Select B,C WHERE A='" & A1 & "'", 0)
Run Code Online (Sandbox Code Playgroud)


Vik*_*tor 5

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

表1:Sheet1!A1:C3

a d g
b e h
c f i
Run Code Online (Sandbox Code Playgroud)

表2:工作表2!A1:C3

c j m
a k n
b l o
Run Code Online (Sandbox Code Playgroud)

这就是公式的构造方式。

连接公式

=ArrayFormula(
   {
     Sheet1!A1:C,
     vlookup(Sheet1!A1:A, {Sheet2!A1:A, Sheet2!B1:C}, {2,3}, false)
   }
)
Run Code Online (Sandbox Code Playgroud)

使此公式生效的关键是了解如何在Vlookup范围中使用大括号。您基本上将Range的第一个单元格引用定义为与Vlookup Search_Key匹配的列。范围中其余的单元格引用与您要联接的列有关。

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

示例:table2中用于联接的列位于其他列中(在要联接的数据的右侧)

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

表1(表1):

a d g
b e h
c f i
Run Code Online (Sandbox Code Playgroud)

表2(表2):

j m c
k n a
l o b
Run Code Online (Sandbox Code Playgroud)

如果您这样编写公式,仍将获得所需的结果(如联接数据表中所示):

=ArrayFormula(
   {
     Sheet1!A1:C,
     vlookup(Sheet1!A1:A, {Sheet2!C1:C, Sheet2!A1:B}, {2,3}, false)
   }
)
Run Code Online (Sandbox Code Playgroud)

联接数据表:

a d g k n
b e h l o 
c f i j m
Run Code Online (Sandbox Code Playgroud)

在联接公式中,请注意,Table2的第三列位于Vlookup范围中的第一个单元格引用中!
之所以可行,是因为当您在Range中使用大括号(与Arrayformula结合使用)时,Vlookup Search_Key不会在原始数据中查找列作为公共分母,而是会在其中使用Array大括号作为参考,以查找一列作为公分母(默认情况下,这是范围的第一列)。

我已经写了一篇有关该主题的综合指南:

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


小智 5

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