Google电子表格“ = QUERY” join()的等效函数?


74

这个问题是关于使用= 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 Spreadsheet告诉我我的复杂性已达极限。

我看一下Google的查询语言参考...似乎没有提到一种“联接”函数。您会认为这将是一个简单的“ A联接”类型的操作。

没有vlookup,谁能解决这个问题?


我猜测,index并且match将具有相同的复杂性vlookups,但你可以试试这个实现。如果这不起作用,那么我认为需要编写自定义函数。
Konstant 2014年

@Konstant。谢谢你的建议。您的解决方案也可以。我认为自新版Google表格以来,这个问题变得不那么重要了。据说他们已经消除了复杂性限制的数量,但是对于较大的图纸,我仍然注意到一些问题。
杰森2014年

如果可以的话,能否与我分享一个样本表(包含大量数据)。我将尝试为它编写一个自定义函数。
Konstant 2014年

我无法分享数据。我认为您可以使用rand()函数来重新创建它
jason 2014年

1
@鲁本。Google何时会重写其查询功能?似乎越来越多的人正在使用它,有时间让它变得更强大!
杰森

Answers:


54

简短答案

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

说明

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

命名范围

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

= ArrayFormula(
   {
     表格1,
     vlookup(ID,table2,COLUMN(Indirect(“ R1C2:R1C”&COLUMNS(table2),0)),0)
   }
)

备注:

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

有关示例,请参见此表

注意

在2017年,Google改进了有关QUERY,QUERY函数的英文官方帮助文章。它仍然没有包括这样的主题,但是可能有助于理解它的工作原理。


2
目前,这是唯一适用于大型数据集而无需在每个单元格中粘贴公式的唯一答案。真的很有帮助。谢谢!
dmitrych '16

1
这是非常聪明的。是否有可能使之成为内部联接?
cjm2671

1
@ cjm2671:谢谢。如果您还没有这样做,请发布一个新问题。这可能是显而易见的,但无论如何...如果您在此处添加一个链接我就可以很容易地找到它:)
鲁本

@jason是否有任何理由为什么未将此答案标记为正确答案?
2016年

1
到目前为止我得到的最佳答案
Sarvar Nishonboev '20

17

您可以使用,ARRAYFORMULA也可以只拖动以下公式:导入或QUERY对第一个表进行-ing操作;在D列中:

=QUERY(Sheet2!A1:C3, "Select B,C WHERE A='" & A1 & "'", 0)

9

因此,这回答了如何使用Vlookup函数(但仅在一个单元格中)实现该功能。
在您的示例中,假设每个数据表都有以下单元格引用:

表1:Sheet1!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匹配的列。范围中其余的单元格引用与您要联接的列有关。

索引写为{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

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

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

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


1

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

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

而且,合并表似乎可以解决这个确切的用例。


合并表是Fusion Tables函数,而不是Sheets函数。
萨穆拉伊18'Feb

0

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

=query({A1:C3,query(sort(A5:C7,1,TRUE),"Select Col2,Col3")})

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.