Функция QUERY позволяет сделать выборку нужных строк из таблицы с помощью SQL-запроса и отсортировать их.
Синтаксис функции:
=QUERY(данные; запрос; [заголовки])
данные — это исходный диапазон, который будет обрабатываться и из которого мы будем формировать выборку;
запрос на языке API визуализации Google (идентичный SQL), указанный в кавычках, с соблюдением определенных правил, которые мы обсудим далее;
заголовки — количество строк с заголовками в исходном диапазоне. По умолчанию равен –1 (минус одному), и это означает, что количество строк с заголовками будет определяться автоматически.
Итак, правила формирования запросов:
В интернете много справочников и статей по языку SQL.
Справка от Google по языку запросов API находится по ссылке:
.
Далее мы рассмотрим несколько примеров применения QUERY на практике.
Из простой исходной таблицы будем формировать список книг по тематике:
При этом тематику выберем из выпадающего списка на отдельном листе:
(Про создание выпадающих списков см. главу .)
Функция QUERY для решения этой задачи будет выглядеть следующим образом:
=QUERY(‘Книги’!A1:C;"SELECT A, C WHERE B = ‘"&A1&"’ ORDER BY C DESC";1)
Мы извлекаем данные из столбцов A и C в диапазоне ‘Книги’!A1:C. Фильтруем данные по столбцу B (тематике) этого диапазона по выбранному критерию из выпадающего списка в ячейке A1. Сортируем по убыванию по столбцу C исходного диапазона и добавляем к нашей выборке заголовки (последний аргумент функции QUERY = 1).
В этом примере мы построим небольшую сводную таблицу, где будут отображены средние значения по тематикам за два года:
QUERY(‘Книги’!A1:D;"SELECT avg(C), avg(D) pivot B";1)
Мы используем похожий диапазон (в отличие от предыдущего, в нем есть продажи за 2015 и 2016 годы), извлекаем средние значения по столбцам C и D (SELECT avg(C), avg(D)) и группируем их по столбцу B (тематика).
Полученный результат транспонируем для удобного отображения (с помощью функции TRANSPOSE (ТРАНСП), которую мы обсуждали ранее):
Можно использовать и другие функции вместо avg (среднего), например max (максимальные значения):
Или отобразить и среднее, и максимум, но только по столбцу D:
SELECT avg(D), max(D)
Для примера возьмем небольшую табличку с численностью населения с 1917 года по наше время.
На этой табличке будем учиться пользоваться QUERY и выводить нужные нам записи.
Первая часть формулы — это выбор массива данных, с которым мы будем работать:
=QUERY(‘Таблица’!A1:F47)
Для самых продвинутых есть вариант с автоматическим расчетом количества строк, которые занимает таблица; этот вариант стоит использовать, если в таблицу заносятся новые данные:
=QUERY(ДВССЫЛ("’Таблица’!A1:F"&5+СЧЁТЗ(‘Таблица’!A6:A))
С помощью формулы СЧЁТЗ мы получаем количество заполненных строк в диапазоне А6:А. Прибавляем к ним 5 — высоту нашей шапки. Получившееся число добавляем к диапазону «Таблица»!a1:f. Дальше при помощи ДВССЫЛ этот текст становится диапазоном ячеек, который можно использовать в формулах.
Если ввести формулу на новый лист в ячейку A1, то она просто отразит всю выбранную табличку.
Переходим ко второй части формулы — это запрос. Тем, кто слышал про SQL, будет совсем легко, а остальным — несложно. Запрос пишется в кавычках, вот его структура:
Третья часть формулы — это количество строк заголовка. В нашем случае их 5, так как данные начинаются с 6-й строки. Также можно ввести -1 или не вводить ничего — количество строк будет определено автоматически.
После долгого вступления перейдем к примерам.
В первом примере выберем только годы и общую численность населения, а ее отсортируем по убыванию:
Во втором примере выведем все строки и столбцы начиная с определенного года, а его сделаем переменной. Год поместим в ячейку G; если пользователь его изменит, изменится и результат вывода. Обратите внимание: если переменной окажется текст, то его в формуле нужно будет выделять апострофами, вот так:
=QUERY(‘Таблица’!A1:F47;"select A,B,C,D,E,F where A>=’"&G1&"’";5)
У нас же год — числовое значение, поэтому без апострофов:
На скриншоте тот массив, который у нас есть:
Наша задача: отобрать строки с продажами начиная с 1 апреля и посчитать по ним средний чек, используя количество клиентов, то есть получить среднее взвешенное.
Начнем. Создадим QUERY с умножением количества клиентов (столбец B) на средний чек (столбец С) начиная с определенной даты:
Правильно использовать дату в формуле QUERY так:
1) QUERY работает с датой только в формате yyyy-mm-dd. Чтобы перевести дату из ячейки Е1 в этот вид, используем формулу ТЕКСТ (TEXT) с условием "yyyy-mm-dd";
2) перед датой и перед апострофом нужно написать date;
3) можно и не давать ссылку на ячейку с датой, а написать ее сразу в QUERY, тогда формула будет выглядеть так:
4) дата с двух сторон обрамляется одиночными кавычками (‘).
Вернемся к тому, что у нас получилось. Наша формула выдала вот такой массив данных:
Это построчные произведения количества клиентов на средний чек. Нам нужно просуммировать их, для этого введем перед формулой СУММ (SUM):
Чтобы рассчитать средний чек, получившееся число нужно разделить на общую сумму клиентов в отобранных строках. Закрепим использование QUERY и снова воспользуемся этой формулой.
Берем предыдущую формулу, меняем B*C на sum(B) и получаем такую конструкцию:
Наконец, совмещаем формулы:
Все работает, ура! 53 — средний чек с учетом количества клиентов, рассчитанный через среднее взвешенное.
Возьмем табличку с продажами книг. На ее основе будем делать отчет с выпадающим списком, в котором появятся все тематики, и формулой QUERY, выводящей книги выбранной тематики и сортирующей их по продажам.
Итак, выпадающий список. Вначале создадим новый лист (допустим, наша исходная таблица огромна и всю аналитику мы хотим производить на другом листе). Кликаем правой кнопкой мыши на ячейку А1, выбираем Проверка данных.
В Правилах выбираем Значение из списка, перечисляем все наши тематики через запятую и нажимаем Сохранить:
Список получился вот таким:
В соседнюю ячейку А2 впишем следующую формулу:
=QUERY(‘Книги’!A1:C13,"SELECT A, C WHERE B = ‘"&A1&"’ ORDER BY C DESC")
И разберем ее по частям:
Результат:
Изменив тематику в ячейке А1 на философию, мы получим книги только по философии, отсортированные по продажам. Удобно.
Если бы в нашей исходной таблице была дата, мы могли бы добавить ее в условие QUERY и выводить данные за выбранный день, месяц, неделю — таким образом можно получить готовый отчет по продажам, который не нужно каждый раз заново собирать.
В качестве первого аргумента функции QUERY можно указать массив, состоящий из нескольких диапазонов данных. Главное, чтобы эти диапазоны были таблицами с одинаковой структурой.
Диапазоны указываются через точку с запятой в фигурных скобках:
=QUERY({Диапазон 1; Диапазон 2; Диапазон 3; Диапазон 4};...)