web-dev-qa-db-ja.com

GoogleシートでUNION SELECTを実行できますか?

Googleスプレッドシートをフォームにリンクし、同じフォームを使用して3回編集して、同じテーマの3人の異なるユーザーからの返信を収集します。これにより、3人がいる場所を示す3つの列を含むシートが作成されます。

これらの3つの列を取得し、それらを相互に隣接するのではなく、互いの下に配置するビュー/クエリを作成する必要があります。データベースでは、以下のクエリのようなことをして、 'シート' tblMainを呼び出し、関連する4つの列を指定しました(サブジェクトIDも必要です)。

tblMain:

ID        RALocation        RBLocation        RCLocation

クエリ:

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

Googleスプレッドシートでこれを行う方法があるかどうかは誰にもわかりますか?複数のシートを作成し、最後にそれらを結合することは気にしませんが、これを行う方法には少し固執しています。

9
AnneB

空のセルを保持するかどうかに応じて、2つのバージョンを提供します。基本的な考え方は同じです:

  1. テーブルに含まれていない文字を選択します(例: CHAR を介してアクセス可能なエキゾチックなUnicode文字)。
  2. 3列ごとに JOIN コマンドで使用します。
  3. 結果を連結し、間に文字を追加します。
  4. SPLIT 同じ文字で連結された文字列。
  5. TRANSPOSE 結果。

例えば:

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

ここで、結合/分割のために、文字CHAR(57344)を選択しました。これは 私的使用のために指定された であり、したがって有効な入力には存在しないはずです。

上記の式は、空白のエントリを削除します。これはSPLITが行うことです。これは、データに空白がない場合に便利です。データの最後の行がどこにあるかを追跡する手間を省きます。ただし、空白を保持する必要がある場合もあります。

空白を保持するには、 Jacob Jan Tuinstraの回答 を使用します。ただし、スペースの代わりに別のプライベートUnicodeを使用します(スペースを含むセルがいくつかあり、それらを保持したい場合があります) )。これには2つの追加手順が含まれます。以前のようにすべてを結合した後、SUBSTITUTEを使用してCHAR(57344)CHAR(57344)&CHAR(57345)に置き換え、次に以前のように分割し、CHAR(57345)を空の文字列に置き換えます。

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

完全な結果は次のようになります(データの最後の行の場所を指定することに注意してください)。

=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), "" )))

もう1つの注意点:Googleスプレッドシートの文字列の長さは50000文字を超えることはできません。データが大きすぎて文字列ベースのアプローチが機能しない場合は、スクリプトを使用します( this one は開始するのに適した場所です)。

3
user79865

現在、次の式を使用すると、Googleスプレッドシートで簡単に結合を作成できます。

={'Sheet1'!A2:A;'Sheet2'!A2:A;'Sheet3'!A2:A}

詳細については、Googleドキュメントヘルプをご覧ください。 Googleスプレッドシートで配列を使用する

3
Emilio Nicolás

簡潔な答え

Googleスプレッドシートは、UNION-SELECTに似た結果を得るためのいくつかの代替手段を備えた非常に強力なツールです。

代替案

組み込みアレイ

SPLIT-TRANSPOSE-JOIN-CHARを使用する代替方法は、埋め込み配列を使用することです。この方法の利点の1つは、文字列を構築/分解する必要がないため、文字数の制限が関係ないことです。

Emdedded array

フィルタリング

上記を FILTER() と組み合わせて使用​​すると、フィルタリングでUNION-SELECTの同様の動作が必要な場合に使用できます。例

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

QUERY() と組み合わせて使用​​することもできますが、その結果にはヘッダー行が含まれます。ヘッダーを取り除く方法については、 Googleスプレッドシートクエリの結果の行を取り除く をご覧ください。

値の列を作成する方法

TRANSPOSE-SPLIT-REPTを使用して、値の列を作成します。

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

QUERY()を使用して値の列を作成することもできますが、ヘッダー行を削除すると、式がより複雑になる可能性があります。文字列の長さの制限が問題を引き起こす場合にのみ使用してください。

組み込みアレイとTRANSPOSE-SPLIT-REPTを使用したソリューション

範囲tblMainがA1:D7であり、A1:D1がテーブルヘッダーであり、データがA2:D7にあると仮定します。

={{"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),","))}}

参照資料

Googleスプレッドシート配列の追加-StackOverflow

2
Rubén