Bisakah Anda melakukan UNION SELECT di Google Sheet?


10

Saya punya Lembar Google yang ditautkan ke formulir yang mengumpulkan balasan dari tiga orang berbeda pada subjek yang sama menggunakan formulir yang sama dan mengedit tiga kali. Ini membuat lembar yang berisi tiga kolom yang menyatakan di mana ketiga orang itu berada.

Saya perlu menghasilkan tampilan / permintaan yang mengambil tiga kolom dan menempatkan mereka 'di bawah' satu sama lain, dan tidak di sebelah satu sama lain. Dalam sebuah database saya akan melakukan sesuatu seperti query di bawah ini, saya telah memanggil 'sheet' tblMain saya, dan menyatakan empat kolom yang relevan (saya juga memerlukan ID subjek).

tblMain:

ID        RALocation        RBLocation        RCLocation

Pertanyaan:

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

Adakah yang tahu jika ada cara untuk melakukan ini di Google Sheets? Saya tidak keberatan membangun lebih dari satu lembar dan kemudian menggabungkannya di bagian akhir, tapi saya agak bingung bagaimana melakukan ini.


Apakah jumlah baris tetap atau akan berubah seiring waktu?
Rubén

Jawaban:


3

Saya menawarkan dua versi, tergantung pada apakah sel kosong harus disimpan. Ide dasarnya sama:

  1. Pilih karakter yang tidak terkandung dalam tabel Anda (mis., Karakter Unicode eksotis yang dapat diakses melalui CHAR).
  2. Gunakan dalam JOINperintah untuk masing-masing dari tiga kolom.
  3. Gabungkan hasilnya, tambahkan karakter di antaranya.
  4. SPLIT string bersambung dengan karakter yang sama.
  5. TRANSPOSE hasil.

Sebagai contoh:

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

di mana untuk bergabung / membelah, saya memilih karakter CHAR(57344), yang ditujukan untuk penggunaan pribadi dan karenanya tidak boleh ada dalam input yang valid.

Rumus di atas menghapus entri kosong , karena ini yang SPLITdilakukan. Ini mungkin nyaman jika data Anda tidak memiliki kosong: menyelamatkan Anda dari kesulitan pelacakan di mana baris terakhir data berada. Tetapi di lain waktu, kekosongan harus dipertahankan.

Untuk menjaga kekosongan, saya mengikuti jawaban oleh Jacob Jan Tuinstra kecuali bahwa saya menggunakan Unicode penggunaan pribadi alih-alih ruang (siapa tahu, mungkin Anda memiliki beberapa sel yang hanya berisi ruang dan Anda ingin menyimpannya). Ini melibatkan dua langkah tambahan: setelah menggabungkan semuanya seperti sebelumnya, saya gunakan SUBSTITUTEuntuk mengganti CHAR(57344)dengan CHAR(57344)&CHAR(57345), lalu membagi seperti sebelumnya, dan mengganti CHAR(57345)dengan string kosong.

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

Hasil lengkapnya terlihat seperti ini (perhatikan bahwa sekarang saya menentukan di mana baris data terakhir):

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

Satu peringatan lagi: string dalam Google Sheets tidak boleh lebih dari 50.000 karakter. Jika data Anda terlalu besar untuk pendekatan berbasis string untuk bekerja, gunakan skrip ( ini adalah tempat yang baik untuk memulai).


Itu berhasil, dan saya bisa menggabungkan mereka untuk mendapatkan hasil yang tepat. Satu-satunya hal yang saya coba lakukan sekarang adalah membuatnya menghargai nilai NULL dan menariknya, ternyata FILTER Anda tidak diperlukan, itu akan menghilangkannya jika menemukan nilai NULL. Adakah yang tahu bagaimana saya mendapatkannya untuk menghormati NULL?
AnneB

1
Sebenarnya, "jawaban lain" adalah jawaban parsial saat ini. Selain alternatif lain, bagian yang hilang yang relevan adalah tentang bagaimana menggunakan array tertanam bukan pendekatan UNION-SELECT.
Rubén

2
Hebat. Saya mungkin harus melihat skrip ketika pilot kami selesai tetapi untuk sekarang saya punya cukup untuk melanjutkan. Orang-orang di sini sangat membantu, terima kasih semuanya!
AnneB


2

Jawaban singkat

Google Sheets adalah alat yang sangat kuat yang memiliki beberapa alternatif untuk mencapai hasil yang mirip dengan UNION-SELECT.

Alternatif

Array tertanam

Alternatif untuk menggunakan cara SPLIT-TRANSPOSE-JOIN-CHAR adalah dengan menggunakan array yang disematkan. Salah satu keuntungan dari metode ini adalah tidak perlu membuat / mendekonstruksi string, sehingga batas jumlah karakter tidak relevan.

Array yang di-emded

Penyaringan

Di atas dapat digunakan dalam kombinasi dengan FILTER () untuk kasus-kasus yang memerlukan penyaringan untuk memiliki perilaku yang sama dari UNION-SELECT. Contoh

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

Juga dapat digunakan dalam kombinasi dengan QUERY () tetapi hasilnya termasuk baris header. Untuk mempelajari tentang cara menyingkirkan tajuk, lihat Singkirkan baris dalam hasil kueri Google Spreadsheets .

Cara membuat kolom nilai

Gunakan TRANSPOSE-SPLIT-REPT untuk membuat kolom nilai.

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

Juga QUERY () dapat digunakan untuk membuat kolom nilai, tetapi menghapus baris header bisa membuat rumus lebih rumit. Gunakan hanya jika batasan panjang string menyebabkan masalah.

Solusi menggunakan Array Tertanam dan TRANSPOSE-SPLIT-REPT

Asumsikan rentang tblMain adalah A1: D7, di mana A1: D1 adalah header tabel, dan data dalam 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),","))}}

Referensi

Menambahkan array spreadsheet google - StackOverflow


Anda harus membaca lebih banyak jawaban dari saya;). Saya belum menemukan artikel bantuan resmi tentang ini. Saya tahu bahwa ada utas di Forum Produk Google dan melalui Internet, seperti referensi yang sudah saya sertakan.
Rubén

Terima kasih untuk ini, saya sedang mencari solusi terakhir, saya pikir itu akan sangat baik untuk pilot kami!
AnneB
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.