选择和多个(顺序范围)标准的位置

时间:2017-08-27 10:41:31

标签: google-sheets google-query-language

我正在为我的工作表寻找一个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)

足以说范围O-Z​​不是28长,但它足以展示我在这个例子中寻找的东西。

问题)是否有更好的方法在连续的列范围内实现此类查询? 特别是在我的情况下,O-AQ的范围

我想我可以在不同的单元格中动态串联所需的cols。但我宁愿不......

3 个答案:

答案 0 :(得分:2)

我知道OP已经回答了。但是提交这个作为替代方案:

对于选择,

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

对于OR部分:

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

要更改开始和结束部分,请更改ROW编号的开始和结束部分:

http://www.asciitable.com

答案 1 :(得分:1)

请尝试将范围转换为数组:

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

我总是使用此方法并通过索引搜索查询中的列,例如查找名为“Name”的列:

=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”可以通过列名或ID找到。

答案 2 :(得分:0)

我已经研究了如何使用尽可能少的静态幻数来动态连接字符串:

首先,包含以下内容的单元格

=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

此数组可以轻松地用于查询的“选择”部分。 因为我的个人表不会到达那里,所以我允许自己不考虑B *单元格的自由。 Array_constrain()列参数允许在将来需要时快速更改为不同大小的数组。

其次,所需的where子句

是一个简单的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"