Google-Tabelle "= QUERY" join () äquivalente Funktion?


73

Diese Frage betrifft das Zusammenführen von zwei Datenbanken in der Google-Tabelle mit der Funktion = QUERY

Ich habe eine solche Tabelle im Bereich A1: C3

a d g
b e h
c f i

Ich habe noch einen Tisch

c j m
a k n
b l o

Ich möchte, dass der Final Table so aussieht

a d g k n
b e h l o 
c f i j m

Ich kann dies tun, indem ich eine Vlookup-Funktion ziemlich einfach in Zelle D1 verwende und sie nach unten und quer einfüge, aber mein Datensatz ist riesig. Ich würde eine ganze Seite mit Lookups benötigen und Google Spreadsheet sagt, dass ich in Bezug auf Komplexität an meiner Grenze bin.

Ich schaue auf die Google Query Language-Referenz ... es scheint keine Art von "Join" -Funktionen zu geben, die erwähnt werden. Sie würden denken, es wäre eine einfache Operation vom Typ "Join on A".

Kann jemand dies ohne einen Lookup lösen?


Ich vermute das indexund matchhätte die gleiche Komplexität wie Lookups, aber Sie können diese Implementierung ausprobieren . Wenn dies nicht funktioniert, muss meiner Meinung nach eine benutzerdefinierte Funktion geschrieben werden.
Konstant

@Konstant. Danke für den Vorschlag. Ihre Lösung funktioniert auch. Ich denke, diese Frage wurde seit den neuen Google-Blättern viel weniger relevant. Angeblich haben sie die Anzahl der Komplexitätsgrenzen beseitigt, aber ich bemerke immer noch einige Probleme bei größeren Blättern.
Jason

Kannst du mir wenn möglich ein Musterblatt (mit riesigen Datenmengen) geben? Ich werde versuchen, eine benutzerdefinierte Funktion für dieselbe zu schreiben.
Konstant

Ich kann die Daten nicht teilen. Ich würde denken, Sie erstellen es mit der rand()Funktion neu
Jason

1
@ ruben. Wann wird Google seine Abfragefunktion neu schreiben? Es scheint, als würden immer mehr Leute es benutzen, Zeit, es robuster zu machen!
Jason

Antworten:


52

Kurze Antwort

Google QUERY Language Version 0.7 (2016) enthält keinen JOIN-Operator (LEFT JOIN). Dies kann jedoch mithilfe einer Array-Formel erreicht werden, deren Ergebnis als Eingabe für die QUERY-Funktion oder für andere Zwecke verwendet werden kann.

Erläuterung

Array-Formeln und die Array-Bearbeitungsfunktionen von Google Sheets ermöglichen es, eine Verbindung zwischen zwei einfachen Tabellen herzustellen. Um das Lesen zu vereinfachen, werden in der vorgeschlagenen Formel benannte Bereiche anstelle von Bereichsreferenzen verwendet.

Benannte Bereiche

  • Tabelle 1: Blatt 1! A1: C3
  • Tabelle 2: Blatt 2! A1: C3
  • ID: Sheet1! A1: A3

Formel

= ArrayFormula (
   {
     Tabelle 1,
     vlookup (ID, Tabelle2, SPALTE (Indirekt ("R1C2: R1C" & SPALTEN (Tabelle2), 0)), 0)
   }}
)

Bemerkungen:

  • Die Verwendung offener Bereiche ist möglich, dies kann jedoch die Tabellenkalkulation verlangsamen.
  • So beschleunigen Sie die Neuberechnungszeit:
    1. Ersetzen Sie Indirect("R1C2:R1C"&COLUMNS(table2),0)durch ein Array von Konstanten von 2 bis zur Anzahl der Spalten von Tabelle2.
    2. Entfernen Sie die leeren Zeilen aus der Tabelle

Beispiel

In diesem Blatt finden Sie ein Beispiel

Hinweis

2017 hat Google den offiziellen Hilfeartikel in englischer Sprache über die Funktion QUERY, QUERY verbessert . Es enthält noch keine Themen wie diese, könnte aber hilfreich sein, um zu verstehen, wie es funktioniert.


2
Im Moment ist dies die einzige Antwort, die tatsächlich für große Datenmengen funktioniert, ohne Formeln in jede Zelle einzufügen. Es ist wirklich hilfreich. Vielen Dank!
Dmitrych

1
Das ist sehr klug. Ist es möglich, daraus einen INNER JOIN zu machen?
cjm2671

1
@ cjm2671: Danke. Wenn Sie dies noch nicht getan haben, stellen Sie bitte eine neue Frage. Dies könnte offensichtlich sein, aber trotzdem ... Wenn Sie hier einen Link hinzufügen, kann ich ihn leicht finden :)
Rubén

@ Jason Gibt es einen Grund, warum diese Antwort nicht als die richtige markiert ist?
Abbood

1
beste Antwort, die ich bisher bekommen habe
Sarvar Nishonboev

17

Sie können ARRAYFORMULAdiese Formel verwenden oder Sie können sie einfach ziehen: nach einem Import oder QUERY-ing der ersten Tabelle; in der Spalte D:

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

9

Dies beantwortet also, wie Sie es mit einer Vlookup-Funktion tun, aber nur in einer Zelle.
In Ihrem Beispiel hat jede Datentabelle die folgenden Zellreferenzen:

Tabelle 1: Blatt 1! A1: C3

a d g
b e h
c f i

Tabelle 2: Blatt 2! A1: C3

c j m
a k n
b l o

So sollte die Formel aufgebaut sein.

Join-Formel

=ArrayFormula(
   {
     Sheet1!A1:C,
     vlookup(Sheet1!A1:A, {Sheet2!A1:A, Sheet2!B1:C}, {2,3}, false)
   }
)

Der Schlüssel, damit diese Formel funktioniert, besteht darin, zu verstehen, wie geschweifte Klammern im Vlookup-Bereich verwendet werden. Grundsätzlich definieren Sie die erste Zellreferenz des Bereichs als die Spalte, die mit dem Vlookup Search_Key übereinstimmen soll. Der Rest der Zellreferenzen im Bereich bezieht sich auf die Spalten, denen Sie beitreten möchten.

Der Index wird als {2,3} geschrieben, um die zweite und dritte Spalte des Bereichs zurückzugeben (der Bereich besteht aus insgesamt 3 Spalten). geschweifte Klammern haben nichts mit Arrayformula im Vlookup-Index zu tun, sind jedoch erforderlich, um mehrere Spalten von der Vlookup-Funktion zurückzugeben. Der Grund, {1,2,3} nicht zu schreiben, besteht darin, dass Sie die Spalte, die zum Verknüpfen verwendet wird, nicht einschließen möchten.

Beispiel, in dem sich die zum Verknüpfen verwendete Spalte in Tabelle 2 in einer anderen Spalte befindet (rechts von den Daten, die verbunden werden sollen)

Diese Art von Join-Formel kann auch dann verwendet werden, wenn sich die Join-Spalte in der zweiten Tabelle als dritte Spalte dieser Tabelle befindet. Angenommen, die Rohdaten in diesem Beispiel würden folgendermaßen aussehen:

Tabelle 1 (Blatt 1):

a d g
b e h
c f i

Tabelle 2 (Blatt 2):

j m c
k n a
l o b

Wenn Sie die Formel so schreiben, erhalten Sie immer noch das gewünschte Ergebnis (wie in der Tabelle der verknüpften Daten angezeigt):

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

Die Tabelle der verknüpften Daten:

a d g k n
b e h l o 
c f i j m

Beachten Sie in der Join-Formel, dass sich die dritte Spalte von Tabelle 2 als erste Zellreferenz im Vlookup-Bereich befindet!
Der Grund, warum dies funktioniert, liegt darin, dass der Vlookup Search_Key bei Verwendung von geschweiften Klammern im Bereich (in Verbindung mit Arrayformula) NICHT nach einer Spalte als gemeinsamen Nenner in den Rohdaten sucht, sondern das darin enthaltene Array verwendet geschweifte Klammern als Referenz, um eine Spalte als gemeinsamen Nenner zu finden (standardmäßig ist dies die erste Spalte des Bereichs).

Ich habe einen umfassenden Leitfaden zu diesem Thema geschrieben:

"Beherrschen von Join-Formeln in Google Sheets"


1

Wenn Sie jeden "Index" (a, b, c) einer bestimmten Zeile oder Spalte zuordnen können, können Sie die INDEXFunktion verwenden.

In diesem Fall könnten Sie wahrscheinlich 'a' Spalte A (oder Zeile 1), 'b' Spalte B (oder Zeile 2) usw. zuordnen.

Außerdem scheinen Zusammenführungstabellen genau diesen Anwendungsfall zu behandeln.


Tabellen zusammenführen ist eine Fusionstabellenfunktion, keine Blattfunktion.
Samuurai

0

Versuchen Sie mit der 'anderen' Tabelle in A5: C7:

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

0

Ich habe dies mit Javascript LINQ (sprachintegrierte Abfrage) gelöst.

Hier können Sie Javascript mit komplexen Verknüpfungsbedingungen angeben. Sie können auch andere SQL-Abfragen ausführen, z. B. Gruppieren, Projizieren, Sortieren und Filtern Ihrer Blätter, als wären sie Datenbanktabellen. Schauen Sie sich die Links unten an.

Beachten Sie, dass ich in der LINQ-Abfragesprache alle Leerzeichen in Spaltennamen durch Unterstriche ersetzt habe, um sie zu gültigen JS-Bezeichnern zu machen.

https://docs.google.com/spreadsheets/d/1DHtQlQUlo-X_YVfo-Wo-b7315sSk2pxL5ci4Y9lxvZo/edit?usp=sharing

https://script.google.com/d/1R5L2ReHJrBRwyoSoVOFLzEQZiGtxidPfPkAeVownt7SWX6TpacY7gA7j/edit?usp=sharing

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.