Можете ли вы сделать UNION SELECT в Google Sheet?


10

Я связал Google Sheet с формой, которая собирает ответы от трех разных людей на одну и ту же тему, используя одну и ту же форму и редактируя ее три раза. Это создает лист, который содержит три столбца, в которых указано, где находятся три человека.

Мне нужно создать представление / запрос, который берет эти три столбца и помещает их «друг под другом», а не рядом друг с другом. В базе данных я бы сделал что-то вроде запроса ниже, я назвал свой «лист» 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 Sheets? Я не против построить более одного листа и затем объединить их в конце, но я немного застрял в том, как это сделать.


Количество строк фиксировано или будет меняться со временем?
Рубен

Ответы:


3

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

  1. Выберите символ, которого нет в вашей таблице (например, экзотический символ Юникода, доступный через 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 Sheets не могут превышать 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 Spreadsheets .

Как создать столбец значений

Используйте 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.