【问题标题】:Pass in a range of cells as variable values to a single query?将一系列单元格作为变量值传递给单个查询?
【发布时间】:2019-11-09 02:47:55
【问题描述】:

我有两张纸,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&""""
  ))

使用 sheet1 的 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 个查询,每个查询查看 200K 行 x 15 列 = 300 万个单元格

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

是否可以将所有这些查询合并为一个?换句话说,告诉公式“我希望您使用范围 B1:B100 中的每个单元格作为查询中 K=x 的变量 x 执行求和查询,并将结果分别放在单元格 A1:A100 中”?

【问题讨论】:

    标签: arrays google-sheets sum google-sheets-formula google-sheets-query


    【解决方案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,替代品包括FILTERSUMIF

    【讨论】:

    • 您好,感谢您的回复。您能否详细说明 DGET 与 Query 的性能改进?改进的意义有多大?
    • DGET 函数是 GS 中唯一的数据库函数。因此,如果您有结构化数据,则可以将其用于垂直查找。与 VLOUKUP 或 QUERY 相比,它可以提高您的电子表格性能。此外,在 DGET 函数中,条件(查找列)位置并不重要。它可以来自任何列。但在 VLOOKUP 中,它应该是第一列。 DGET 唯一的缺点是它无法处理数据集中的重复项。
    【解决方案2】:

    我希望作为您的单个查询,B8 必须更改为 sheet1 中的最后一行

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多