web-dev-qa-db-ja.com

Googleスプレッドシート「= QUERY」join()同等の機能

この質問は、= 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関数を非常に簡単に使用し、上下に貼り付けますが、私のデータセットは巨大です。 vlookupsのページ全体が必要になりますが、Googleスプレッドシートは複雑さの限界に達していることを示しています。

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

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

52
jason

短い答え

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

説明

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

名前付き範囲

  • 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)を2からtable2の列数までの定数の配列に置き換えます。
    2. スプレッドシートから空の行を削除します

例については このシート をご覧ください

注意

2017年、GoogleはQUERYに関する英語の公式ヘルプ記事 QUERY function を改善しました。このようなトピックはまだ含まれていませんが、その仕組みを理解するのに役立ちます。

33
Rubén

ARRAYFORMULA を使用できます。または、次の式をドラッグできます。インポート後、または最初のテーブルをQUERY- ingします。 D列:

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

したがって、これは、Vlookup関数を使用して、1つのセル内でそれを行う方法に答えます。
例では、各データテーブルに次のセル参照があるとします。

表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で中括弧を使用する方法を理解することです。基本的に、Vlookup Search_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

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

このトピックに関する包括的なガイドを作成しました。

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

4
Viktor

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

この場合、おそらく「a」を列A(または行1)に、「b」を列B(または行2)に、などとマッピングできます。

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

1
Marco Roy

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

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