Передать диапазон ячеек в качестве значений переменных в один запрос? - PullRequest
1 голос
/ 09 ноября 2019

У меня есть два листа, sheet1 и sheet2. Столбец E листа 2 содержит количество, а столбец K содержит текстовую строку (т. Е. Ключ). Несколько строк в sheet2 содержат одну и ту же текстовую строку с разным количеством.

В столбце B sheet1 у меня есть список текстовых строк. Для каждой текстовой строки я хочу запросить sheet2 и суммировать все количества в столбце E, где значение в столбце K соответствует текстовой строке.

В настоящее время мне нужно x запросов, где x - это числотекстовые строки в столбце В листа 1.

Каждый текущий запрос в листе 1 выглядит следующим образом:

Запрос в ячейке А1 листа1 с использованием текстовой строки в В1 листа1

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

Запрос в A2 с использованием текстовой строки в B2 листа1

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

и т. Д. *

Ячейка P1 листа2 содержит число ненулевых строк в листе2

Это хорошо работает, но проблема в том, что sheet2 содержит 200 000 строк. У меня есть около 100 текстовых строк для поиска, поэтому в настоящее время я использую 100 запросов, каждый из которых просматривает 200K строк x 15 столбцов = 3 миллиона ячеек

Понятно, что обновление листа занимает много временивсе эти запросы повторяются при обновлении sheet2.

Можно ли объединить все эти запросы в один? Другими словами, скажите формулу: «Я хочу, чтобы вы выполнили запрос суммы, используя каждую ячейку в диапазоне B1: B100 в качестве переменной x для K = x в запросе, и поместите результаты в ячейки A1: A100 соответственно»?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

в некоторых случаях помещение его в массив может немного повысить производительность:

={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

0 голосов
/ 09 ноября 2019

Надеюсь, что как ваш единственный запрос, B8 должен быть изменен на последнюю строку в sheet1

=arrayformula(vlookup({Sheet1!B1:B8},QUERY(Sheet2!A1:K,"select K, sum(E) where K<>0 group by K "),2,false))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...