Können Sie eine UNION SELECT in einem Google Sheet durchführen?


10

Ich habe ein Google Sheet mit einem Formular verknüpft, das Antworten von drei verschiedenen Personen zum gleichen Thema mit demselben Formular sammelt und dreimal bearbeitet. Dadurch wird ein Blatt erstellt, das drei Spalten enthält, in denen angegeben ist, wo sich die drei Personen befinden.

Ich muss eine Ansicht / Abfrage erstellen, die diese drei Spalten verwendet und sie untereinander und nicht nebeneinander platziert. In einer Datenbank hätte ich so etwas wie die folgende Abfrage durchgeführt, ich habe mein 'Blatt' tblMain aufgerufen und die relevanten vier Spalten angegeben (ich benötige auch die Betreff-ID).

tblMain:

ID        RALocation        RBLocation        RCLocation

Abfrage:

Select ID, RALocation as Location, 'RA' as Role from tblMain
Union
Select ID, RBLocation as Location, 'RB' as Role from tblMain
Union
Select ID, RCLocation as Location, 'RC' as Role from tblMain

Weiß jemand, ob es in Google Sheets eine Möglichkeit gibt, dies zu tun? Es macht mir nichts aus, mehr als ein Blatt zu erstellen und sie am Ende zu kombinieren, aber ich bin ein bisschen festgefahren, wie das geht.


Ist die Anzahl der Zeilen festgelegt oder ändert sich diese im Laufe der Zeit?
Rubén

Antworten:


3

Ich biete zwei Versionen an, je nachdem, ob leere Zellen aufbewahrt werden sollen. Die Grundidee ist dieselbe:

  1. Wählen Sie ein Zeichen aus, das nicht in Ihrer Tabelle enthalten ist (z. B. ein exotisches Unicode-Zeichen, auf das über zugegriffen werden kann CHAR).
  2. Verwenden Sie es im JOINBefehl für jede der drei Spalten.
  3. Verketten Sie die Ergebnisse und fügen Sie das Zeichen dazwischen hinzu.
  4. SPLIT die verkettete Zeichenfolge mit demselben Zeichen.
  5. TRANSPOSE das Ergebnis.

Zum Beispiel:

=TRANSPOSE( SPLIT( JOIN(CHAR(57344),A1:A) &CHAR(57344)& JOIN(CHAR(57344),B1:B) &CHAR(57344)& JOIN(CHAR(57344),C1:C), CHAR(57344) ) )

Wo zum Verbinden / Teilen habe ich das Zeichen ausgewählt CHAR(57344), das für den privaten Gebrauch bestimmt ist und daher in keiner gültigen Eingabe vorhanden sein sollte.

Die obige Formel entfernt leere Einträge , da dies der SPLITFall ist. Dies kann praktisch sein, wenn Ihre Daten keine Leerzeichen enthalten: Sie sparen sich die Mühe, zu verfolgen, wo sich die letzte Zeile der Daten befindet. In anderen Fällen sollten Leerzeichen erhalten bleiben.

Um Leerzeichen zu erhalten, folge ich der Antwort von Jacob Jan Tuinstra, außer dass ich anstelle von Leerzeichen einen anderen Unicode für den privaten Gebrauch verwendet habe (wer weiß, vielleicht haben Sie einige Zellen, die nur ein Leerzeichen enthalten, und Sie möchten diese behalten). Dies beinhaltet zwei zusätzliche Schritte: Nachdem ich alles wie zuvor verbunden habe SUBSTITUTE, ersetze ich es CHAR(57344)durch CHAR(57344)&CHAR(57345), teile es dann wie zuvor und ersetze es CHAR(57345)durch eine leere Zeichenfolge.

=TRANSPOSE( ARRAYFORMULA(SUBSTITUTE( SPLIT( SUBSTITUTE(...joins... , CHAR(57344),CHAR(57344)&CHAR(57345)), CHAR(57344) ), CHAR(57345), "")))

Das vollständige Ergebnis sieht folgendermaßen aus (beachten Sie, dass ich jetzt spezifiziere, wo sich die letzte Datenzeile befindet):

=TRANSPOSE( ARRAYFORMULA(SUBSTITUTE( SPLIT( SUBSTITUTE(JOIN(CHAR(57344),A1:A9) &CHAR(57344)& JOIN(CHAR(57344),B1:B9) &CHAR(57344)& JOIN(CHAR(57344),C1:C9), CHAR(57344),CHAR(57344)&CHAR(57345)), CHAR(57344) ), CHAR(57345), "" )))

Noch eine Einschränkung: Zeichenfolgen in Google Sheets dürfen nicht länger als 50000 Zeichen sein. Wenn Ihre Daten zu groß sind, als dass ein auf Zeichenfolgen basierender Ansatz funktionieren könnte, verwenden Sie ein Skript ( dieses ist ein guter Ausgangspunkt).


Das ist ein Vergnügen, und ich kann sie kombinieren, um das richtige Ergebnis zu erzielen. Das einzige, was ich jetzt versuche, ist, es dazu zu bringen, NULL-Werte zu respektieren und sie zu ziehen. Es stellt sich heraus, dass Ihr FILTER nicht benötigt wurde. Es werden sie entfernt, wenn es NULL-Werte findet. Irgendeine Idee, wie ich es bekomme, den NULL zu respektieren?
AnneB

1
Tatsächlich ist die "andere Antwort" zu diesem Zeitpunkt eine Teilantwort. Neben anderen Alternativen geht es im relevanten fehlenden Teil darum, wie eingebettete Arrays anstelle des UNION-SELECT-Ansatzes verwendet werden.
Rubén

2
Wunderbar. Ich werde mir wahrscheinlich das Drehbuch ansehen müssen, wenn unser Pilot vorbei ist, aber jetzt habe ich genug, um weiterzumachen. Die Leute hier sind wirklich hilfreich, ich danke Ihnen allen!
AnneB


2

Kurze Antwort

Google Sheets ist ein sehr leistungsfähiges Tool, das verschiedene Alternativen bietet, um ein ähnliches Ergebnis wie UNION-SELECT zu erzielen.

Alternativen

Eingebettete Arrays

Eine Alternative zur Verwendung von SPLIT-TRANSPOSE-JOIN-CHAR ist die Verwendung eingebetteter Arrays. Ein Vorteil dieser Methode besteht darin, dass keine Zeichenfolgen erstellt / dekonstruiert werden müssen, sodass die Begrenzung der Anzahl der Zeichen nicht relevant ist.

Eingebettetes Array

Filtern

Das Obige kann in Kombination mit FILTER () für Fälle verwendet werden, in denen eine Filterung erforderlich ist, um ein ähnliches Verhalten wie UNION-SELECT zu erzielen. Beispiel

={Filter(A1:B2, B1:B2=2);Filter(D1:E2, E1:E2=6);Filter(G1:H2, H1:H2=12)}

Kann auch in Kombination mit QUERY () verwendet werden , enthält jedoch eine Kopfzeile. Informationen zum Entfernen der Kopfzeilen finden Sie unter Entfernen von Zeilen als Ergebnis der Google Spreadsheets-Abfrage .

So erstellen Sie eine Wertespalte

Verwenden Sie TRANSPOSE-SPLIT-REPT, um eine Wertespalte zu erstellen.

={Transpose(Split(REPT("RA,",6),","))}

Auch QUERY () könnte verwendet werden, um eine Wertespalte zu erstellen, aber das Entfernen der Kopfzeile könnte die Formel komplexer machen. Verwenden Sie es nur, wenn die Einschränkungen der Zeichenfolgenlänge Probleme verursachen.

Lösung mit Embedded Arrays und TRANSPOSE-SPLIT-REPT

Angenommen, der Bereich tblMain ist A1: D7, wobei A1: D1 die Tabellenüberschriften sind und die Daten in A2: D7 sind.

={{"ID";A2:A7;A2:A7;A2:A7},
{"Location";B2:B7;C2:C7;D2:D7},{"Role";
Transpose(Split(REPT("RA,",6),","));
Transpose(Split(REPT("RB,",6),","));
Transpose(Split(REPT("RC,",6),","))}}

Verweise

Anhängen von Google Spreadsheet-Arrays - StackOverflow


Du musst mehr Antworten von mir lesen;). Ich habe noch keine offiziellen Hilfeartikel dazu gefunden. Ich weiß, dass es Threads in den Google-Produktforen und über das Internet gibt, wie die Referenz, die ich bereits aufgenommen habe.
Rubén

Vielen Dank dafür. Ich suche derzeit nach der letzten Lösung. Ich denke, sie wird für unseren Piloten sehr gut funktionieren!
AnneB
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.