Выберите и где по нескольким (последовательный диапазон) критериев

Я ищу решение SQL для моего листа, которое смотрит ровно на 28 столбцов в строку, и, если в этом диапазоне есть непустые значения, извлекает его.

В настоящее время я могу получить именно то, что хочу, используя эту ужасную формулу:

QUERY(SomeOtherSheet!A85:BA,"select A,B,C,O,P,Q,R,S,T,U,V,W,X,Y,Z where (O>=0 OR P>=0 OR Q>=0 OR R>=0 OR S>=0 OR T>=0 OR U>=0 OR V>=0 OR W>=0 OR X>=0 OR Y>=0 OR Z>=0) ",1)

Достаточно сказать, что диапазон OZ не совсем 28, но этого достаточно, чтобы продемонстрировать то, что я ищу в этом примере.

Вопрос) Есть ли лучший способ выполнить запрос такого типа в последовательном диапазоне столбцов? конкретно в моем случае диапазон O-AQ

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

3 ответа

Решение

Я знаю, что ОП уже ответил. Но представив это как альтернативу:

Для выбора,

  =ARRAYFORMULA(JOIN(",",CHAR(ROW(65:90)),"A"&CHAR(ROW(65:90))))

Для части где ИЛИ:

    =ARRAYFORMULA(JOIN(">=0 OR ", CHAR(Row(65:90)),"A"&CHAR(ROW(65:90))))&">=0"

Чтобы изменить начальную и конечную части, измените начальную и конечную части номера строки:

http://www.asciitable.com/

Пожалуйста, попробуйте преобразовать диапазон в массив:

QUERY({SomeOtherSheet!A85:BA},"select Col1,Col2,Col3,...")

Я всегда использую этот метод и ищу столбцы внутри запроса по их индексу, например, ищу столбец с именем "Имя":

=match("Name", SomeOtherSheet!A85:BA85, 0)


Обновление Комбинировать OR часть запроса:

="where Col"&JOIN(" >= 0 or Col",ARRAYFORMULA(COLUMN(O1:Z1)))&" >= 0"

Результат:

"where Col15 >= 0 or Col16 >= 0 or Col17 >= 0 or Col18 >= 0 or Col19 >= 0 or Col20 >= 0 or Col21 >= 0 or Col22 >= 0 or Col23 >= 0 or Col24 >= 0 or Col25 >= 0 or Col26 >= 0"

Если новые столбцы будут вставлены в диапазон O1:Z1 эта формула будет корректироваться. В реальных проектах полезно найти диапазоны по их точкам: начальная ячейка, последняя ячейка и затем использовать indirect:

="where Col"&JOIN(" >= 0 or Col",ARRAYFORMULA(COLUMN(indirect(range))))&" >= 0"

где range Имя диапазона со строкой "O1:Z1", "O1" и "Z1" находятся по именам столбцов или идентификаторам.

Ну, я разработал, как динамически объединить строку с минимальным количеством статических магических чисел:

Во-первых, ячейка, которая содержит:

=ARRAY_CONSTRAIN(ArrayFormula((IF((COLUMN(Lifetime!N$8:$8)+64)>CODE("Z"),"A"&CHAR(MOD(COLUMN(Lifetime!N$8:$8),26)+64),""&CHAR(COLUMN(Lifetime!N$8:$8)+64)))),1,28)

что дает нам следующий массив:

N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO

этот массив можно легко использовать для части запроса Select. Я позволил себе свободу не учитывать ячейки, которые будут B*, так как мой личный лист не попадет туда. Array_constrain() Параметр column позволяет быстро менять размер массивов, если это необходимо в будущем.

Во-вторых, простой textjoin() + regexreplace() для требуемой оговорки

=REGEXREPLACE(TEXTJOIN(",",FALSE,A119:AB119),",",">=0 OR ")&">=0"

что приводит к обязательной строке для предложения where:

N>=0 OR O>=0 OR P>=0 OR Q>=0 OR R>=0 OR S>=0 OR T>=0 OR U>=0 OR V>=0 OR W>=0 OR X>=0 OR Y>=0 OR Z>=0 OR AA>=0 OR AB>=0 OR AC>=0 OR AD>=0 OR AE>=0 OR AF>=0 OR AG>=0 OR AH>=0 OR AI>=0 OR AJ>=0 OR AK>=0 OR AL>=0 OR AM>=0 OR AN>=0 OR AO>=0

И конечный продукт:

=ARRAY_CONSTRAIN(QUERY(Lifetime!A85:BA,"select A,B,C,"&120&" where ("&A121&")",1),105,20)

или как однострочник:

=REGEXREPLACE(TEXTJOIN(",",FALSE,ARRAY_CONSTRAIN(ArrayFormula((IF((COLUMN(Lifetime!N$8:$8)+64)>CODE("Z"),"A"&CHAR(MOD(COLUMN(Lifetime!N$8:$8),26)+64),""&CHAR(COLUMN(Lifetime!N$8:$8)+64)))),1,28)),",",">=0 OR ")&">=0"
Другие вопросы по тегам