我有两张纸,sheet1和sheet2。 sheet2的E列包含数量,K列包含文本字符串(即键)。 sheet2中的多行包含相同的文本字符串,但数量不同。
在sheet1列B上,我有一个文本字符串列表。对于每个文本字符串,我要查询sheet2并汇总其E列中的所有数量,其中K列中的值与文本字符串匹配。
当前,我需要执行x个查询,其中x是sheet1的B列中文本字符串的数量。
sheet1中的每个当前查询如下:
使用sheet1的B1中的文本字符串在sheet1单元格A1中查询
=SUM(
QUERY(
'sheet2'!$A$2:INDIRECT(CONCATENATE("'sheet2'!O",'sheet2'!P1)), "select E where K="""&B1&""""
))
在工作表1的B2中使用文本字符串在A2中进行查询
=SUM(
QUERY(
'sheet2'!$A$2:INDIRECT(CONCATENATE("'sheet2'!O",'sheet2'!P1)), "select E where K="""&B2&""""
))
以此类推...
sheet2的单元格P1包含sheet2中非零行的数量
这很好用,但是问题是sheet2包含200,000行。 我大约有100个文本字符串要搜索,因此我目前正在使用100个查询,每个查询查找20万行x 15列= 300万个单元格
可以理解,工作表更新需要很长时间,因为在sheet2更新时所有这些查询都会重新运行。
是否可以将所有这些查询合并为一个?换句话说,告诉公式“我希望您使用范围B1:B100中的每个单元格作为查询中K = x的变量x来执行求和查询,并将结果分别放在单元格A1:A100中” / p>
答案 0 :(得分:1)
在某些情况下,将其放入数组可能会提高性能:
={SUM(QUERY('sheet2'!$A$2:INDIRECT(CONCATENATE("'sheet2'!O", 'sheet2'!P1)),
"select E where K="""&B1&""""));
SUM(QUERY('sheet2'!$A$2:INDIRECT(CONCATENATE("'sheet2'!O", 'sheet2'!P1)),
"select E where K="""&B2&""""))}
但是,应避免使用过多的QUERY
函数以防止停止。最佳性能属于DGET
,备选方案包括FILTER
和SUMIF
答案 1 :(得分:0)
我希望这是您的单个查询,必须将B8更改为sheet1的最后一行
=arrayformula(vlookup({Sheet1!B1:B8},QUERY(Sheet2!A1:K,"select K, sum(E) where K<>0 group by K "),2,false))