Чи можна зробити UNION SELECT в Google Sheet?


10

У мене є лист Google, пов’язаний із формою, яка збирає відповіді від трьох різних людей на ту саму тему, використовуючи ту саму форму та редагуючи три рази. Це створює аркуш, який містить три стовпці із зазначенням того, де розташовані три людини.

Мені потрібно створити подання / запит, який займає ці три стовпці і ставить їх «під один», а не поруч. У базі даних я б зробив щось на кшталт запиту нижче, я назвав свій "аркуш" tblMain і заявив відповідні чотири стовпці (мені також потрібен ідентифікатор теми).

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 Таблицях? Я не проти скласти більше одного аркуша, а потім комбінувати їх наприкінці, але я трохи застряг у тому, як це зробити.


Чи виправлена ​​кількість рядків або вона буде змінюватися з часом?
Рубен

Відповіді:


3

Я пропоную дві версії, залежно від того, чи слід зберігати порожні комірки. Основна ідея та ж:

  1. Виберіть персонажа, який не міститься у вашій таблиці (наприклад, екзотичний символ Unicode, доступний через CHAR).
  2. Використовуйте його в 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робить. Це може бути зручно, якщо у ваших даних немає пробілів: це позбавить вас від проблеми відстежувати, де знаходиться останній рядок даних. Але в інші часи заготовки слід зберегти.

Щоб зберегти пробіли, я слідую за відповіддю Якоба Яна Туінстра, за винятком того, що я використовував інше приватне використання Unicode замість простору (хто знає, можливо у вас є кілька комірок, які містять просто простір, і ви хочете зберегти їх). Це включає два додаткові кроки: після приєднання до всього, як і раніше, я використовую 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), "" )))

Ще один застереження: рядки в Google Таблицях не можуть перевищувати 50000 символів. Якщо ваші дані занадто великі для підходу до роботи на основі рядків, використовуйте скрипт ( цей варіант є гарним місцем для початку).


Це спрацює частування, і я можу комбінувати їх, щоб отримати правильний результат. Єдине, що я зараз намагаюся зробити, це змусити його поважати значення NULL і перетягнути їх, виявляється, що ваш FILTER не був потрібний, він вийме їх, якщо він знайде значення NULL. Будь-яка ідея, як я змушую її поважати NULL?
AnneB

1
Насправді "інша відповідь" є частковою відповіддю на даний момент. Окрім інших альтернатив, відповідна відсутність стосується того, як використовувати вбудовані масиви замість підходу UNION-SELECT.
Рубен

2
Чудовий. Напевно, мені доведеться переглянути сценарій, коли наш пілот закінчиться, але поки що у мене достатньо, щоб продовжувати. Люди тут дуже корисні, дякую всім!
AnneB


2

Коротка відповідь

Google Sheets - це дуже потужний інструмент, який має декілька альтернатив для досягнення результату, подібного до UNION-SELECT.

Альтернативи

Вбудовані масиви

Альтернативою для використання способу SPLIT-TRANSPOSE-JOIN-CHAR є використання вбудованих масивів. Однією з переваг цього методу є те, що він не потребує побудови / деконструкції рядків, тому обмеження кількості символів це не актуально.

Поміщений масив

Фільтрування

Вищезазначене може використовуватися в поєднанні з 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


Ви повинні прочитати більше відповідей від мене;). Я ще не знайшов офіційних статей довідки з цього приводу. Я знаю, що на форумах продуктів Google і в Інтернеті є теми, як посилання, яке я вже включив.
Рубен

Дякую за це, я зараз переглядаю останнє рішення, думаю, це буде дуже добре для нашого пілота!
AnneB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.