将一系列单元格作为变量值传递给单个查询?

Pass in a range of cells as variable values to a single query?

我有两个 sheet,sheet1 和 sheet2。 sheet2 的 E 列包含数量,K 列包含文本字符串(即键)。 sheet2 中的多行包含具有不同数量的相同文本字符串。

在 sheet1 列 B 上,我有一个文本字符串列表。对于每个文本字符串,我想查询 sheet2 并汇总其 E 列中 K 列中的值与文本字符串匹配的所有数量。

目前,我需要 x 个查询,其中 x 是 sheet1.

的 B 列中文本字符串的数量

sheet1 中的每个当前查询如下所示:

使用 sheet1

的 B1 中的文本字符串在 sheet1 单元格 A1 中查询
 =SUM(
  QUERY(
    'sheet2'!$A:INDIRECT(CONCATENATE("'sheet2'!O",'sheet2'!P1)), "select  E where K="""&B1&""""
  ))

使用 sheet1

的 B2 中的文本字符串在 A2 中查询
 =SUM(
  QUERY(
    'sheet2'!$A:INDIRECT(CONCATENATE("'sheet2'!O",'sheet2'!P1)), "select  E where K="""&B2&""""
  ))

等等...

sheet2 的单元格 P1 包含 sheet2

中的非零行数

这很好用,但问题是 sheet2 包含 200,000 行。 我有大约 100 个文本字符串要搜索,所以我目前使用 100 个查询,每个查询查看 200K 行 x 15 列 = 300 万个单元格

可以理解,sheet 需要很长时间才能更新,因为当 sheet2 更新时,所有这些查询都会重新 运行。

是否可以将所有这些查询合并为一个?也就是说,告诉公式"I want you to perform the sum-query using each cell in the range B1:B100 as the variable x for K=x in the query and place the results in cells A1:A100 respectively"?

在某些情况下,将其放入数组中可能会提高一点性能:

={SUM(QUERY('sheet2'!$A:INDIRECT(CONCATENATE("'sheet2'!O", 'sheet2'!P1)), 
      "select E where K="""&B1&""""));
  SUM(QUERY('sheet2'!$A:INDIRECT(CONCATENATE("'sheet2'!O", 'sheet2'!P1)), 
      "select E where K="""&B2&""""))}

但是,QUERY函数应该避免太多,以防卡顿。最佳表现属于 DGET,备选方案包括 FILTERSUMIF

这个希望作为你的单条查询,B8一定要改到sheet1的最后一行

=arrayformula(vlookup({Sheet1!B1:B8},QUERY(Sheet2!A1:K,"select K, sum(E) where K<>0 group by K "),2,false))