将一系列单元格作为变量值传递给单个查询?
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
,备选方案包括 FILTER
和 SUMIF
这个希望作为你的单条查询,B8一定要改到sheet1的最后一行
=arrayformula(vlookup({Sheet1!B1:B8},QUERY(Sheet2!A1:K,"select K, sum(E) where K<>0 group by K "),2,false))
我有两个 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
,备选方案包括 FILTER
和 SUMIF
这个希望作为你的单条查询,B8一定要改到sheet1的最后一行
=arrayformula(vlookup({Sheet1!B1:B8},QUERY(Sheet2!A1:K,"select K, sum(E) where K<>0 group by K "),2,false))