79

この質問は、=QUERY関数を使用してGoogleスプレッドシートの2つのデータベースを結合することに関するものです

私は範囲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のページ全体が必要であり、Googleスプレッドシートは私が複雑さの限界に達していると言っています。

Googleのクエリ言語リファレンスを調べます...言及されている「結合」関数のタイプはないようです。簡単な「Aに参加」タイプの操作だと思います。

誰かがvlookupなしでこれを解決できますか?

4

6 に答える 6

62

短い答え

Google QUERY言語バージョン0.7(2016)にはJOIN(LEFT JOIN)演算子が含まれていませんが、これは、QUERY関数またはその他の用途の入力として使用できる配列数式を使用することで実現できます。

説明

配列数式とGoogleスプレッドシートの配列処理機能により、2つの単純なテーブル間で結合を行うことができます。読みやすくするために、提案された式では、範囲参照の代わりに名前付き範囲を使用します。

名前付き範囲

  • table1:Sheet1!A1:C3
  • table2:Sheet2!A1:C3
  • ID: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関数に関する英語の公式ヘルプ記事を改善しました。このようなトピックはまだ含まれていませんが、どのように機能するかを理解するのに役立つ可能性があります。

于 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つのセルのみです。
あなたの例では、データの各テーブルに次のセル参照があるとします。

表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範囲で中括弧を使用する方法を理解することです。基本的に、範囲の最初のセル参照を、VlookupSearch_Keyに一致する列として定義します。範囲内の残りのセル参照は、結合する列に関連しています。

インデックスは{2,3}と記述され、範囲の2番目と3番目の列を返します(範囲は合計3列で構成されます)。中括弧は、VlookupインデックスのArrayformulaとは関係ありませんが、Vlookup関数から複数の列を返すために必要です。{1,2,3}と書かない理由は、結合の目的で使用されている列を含めたくないためです。

結合に使用されるtable2の列が、別の列(結合されるデータの右側)にある例。

この種の結合式は、2番目のテーブルの結合列がそのテーブルの3番目の列として配置されている場合でも利用できます。この例の生データは次のようになります。

表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

結合式では、表2の3番目の列がVlookup範囲の最初のセル参照として配置されていることに注意してください。
これが機能する理由は、範囲で中括弧を使用する場合(Arrayformulaと組み合わせて)、Vlookup Search_Keyは生データ内の共通分母として列を検索せず、代わりに内の配列を使用するためです。共通の分母として列を見つけるための参照としての中括弧(デフォルトでは、これは範囲の最初の列です)。

私はこのトピックに関する包括的なガイドを書きました:

「Googleスプレッドシートの結合式をマスターする」

于 2019-03-17T16:57:49.960 に答える
1

各「インデックス」(a、b、c)を特定の行または列にマップできる場合は、INDEX関数を使用できます。

この場合、おそらく「a」を列A(または行1)にマップし、「b」を列B(または行2)にマップすることができます。

また、MergeTablesはこの正確なユースケースに対応しているようです。

于 2017-01-17T18:56:59.850 に答える
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 に答える
0

A5:C7の「その他」のテーブルを使用して、次のことを試してください。

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