Все материалы
BIгайдстарт

Функция QUERY в Google Таблицах: синтаксис, примеры и ошибки

QUERY в Google Таблицах на одном листе заказов: select, where, group by, pivot, даты, ссылки на ячейки, Col1 с IMPORTRANGE и ошибки. Каждый результат пересчитан.

КейсПрактика27 октября 2026 г.16 мин

Руководитель просит отчёт: выручка по каналам за октябрь, только оплаченные заказы, крупные — отдельным списком. В Google Таблицах это можно собрать фильтрами, СУММЕСЛИМН и сводной, а можно одной формулой QUERY. Она принимает диапазон и текст запроса на языке, очень похожем на SQL: выбрать столбцы, отфильтровать строки, сгруппировать, отсортировать. Ниже — синтаксис, учебный лист из пятнадцати заказов, запросы с результатами и ошибки, из-за которых QUERY возвращает пустоту или неверную сумму. Результат каждого запроса пересчитан на Python, поведение функции сверено со справкой Google 27 октября 2026 года.

Коротко: что делает QUERY

QUERY выполняет запрос к диапазону и выводит результат таблицей, которая начинается в ячейке с формулой и растекается вправо и вниз. Запрос пишется текстом в кавычках. Если поменять исходные данные, результат пересчитается сам.

  • Синтаксис: =QUERY(данные; "запрос"; [заголовки]), у нас — =QUERY(Заказы!A1:G16; "select …"; 1).
  • Столбцы называют буквами листа: A, D, F. Если данные — результат другой функции, например IMPORTRANGE, — Col1, Col2.
  • Текст внутри запроса — в одинарных кавычках: where G = 'Оплачен'. Даты — литералом date '2026-10-01'.
  • Порядок частей строгий: select, where, group by, pivot, order by, limit, offset, label, format, options.
  • Сравнение текста учитывает регистр, а month() считает месяцы с нуля: октябрь — это 9.

Учебные данные: лист «Заказы»

Все примеры серии «Google Таблицы для аналитика» идут на одном листе: пятнадцать заказов интернет-магазина за сентябрь и октябрь 2026 года. Числа учебные, заданы автором. Заголовки стоят в строке 1, заказы — в строках 2–16. Всего на листе заказов на 76 300 ₽, из них оплаченных двенадцать на 58 500 ₽.

В столбце A лежат настоящие даты, а не текст. QUERY распознаёт такой столбец как тип «дата», и с ним работают условия вида A >= date '2026-10-01'. Если дата пришла из выгрузки строкой, её сначала нужно превратить в дату — об этом в разделе об ошибках.

Лист «Заказы», строки 2–16
Стр.A: ДатаB: ЗаказC: КлиентD: КаналE: ГородF: Сумма, ₽G: Статус
202.09.20261001ОрловаПоискМосква4 200Оплачен
303.09.20261002КимСоцсетиКазань1 800Оплачен
405.09.20261003БеловEmailМосква6 500Отменён
509.09.20261004ОрловаПоискМосква3 100Оплачен
612.09.20261005ЗайцеваПартнёрыПермь9 400Оплачен
718.09.20261006КимСоцсетиКазань2 700Возврат
824.09.20261007ГромовПоискПермь5 200Оплачен
901.10.20261008БеловEmailМосква7 300Оплачен
1004.10.20261009ЛаптеваСоцсетиМосква1 500Оплачен
1108.10.20261010ОрловаПоискМосква4 800Оплачен
1211.10.20261011ГромовПартнёрыПермь8 600Отменён
1315.10.20261012ЗайцеваПартнёрыПермь9 900Оплачен
1419.10.20261013КимEmailКазань2 300Оплачен
1522.10.20261014ЛаптеваСоцсетиМосква3 900Оплачен
1626.10.20261015НовиковПоискКазань5 100Оплачен

Синтаксис QUERY: три аргумента

Первый аргумент — данные: диапазон вместе со строкой заголовков, у нас Заказы!A1:G16. Удобнее брать столбцы целиком, Заказы!A:G: новые заказы попадут в отчёт без правки формулы, а пустые строки отсекает условие where A is not null.

Второй аргумент — запрос, текст в двойных кавычках. Ключевые слова можно писать любым регистром, select и SELECT равнозначны. Строки внутри запроса берутся в одинарные кавычки, потому что двойные уже заняты формулой. Запрос можно держать и в отдельной ячейке и ссылаться на неё: так его проще читать и править.

Третий аргумент — сколько строк сверху считать заголовком. Если его опустить, QUERY угадывает сама по содержимому. Угадывание срабатывает не всегда: когда в первой строке под заголовком стоит текст в числовом столбце, функция может склеить две строки в один заголовок. Поэтому лучше писать явно: 1, если заголовок одна строка, 0 — если его нет.

Аргументы в русской локали разделяются точкой с запятой, в английской — запятой. Название функции не переводится: в русских Таблицах это тоже QUERY.

Синтаксис
QUERY(данные; запрос; [заголовки])

Части запроса идут строго в порядке: select, where, group by, pivot, order by, limit, offset, label, format, options. Любую можно пропустить, но переставить нельзя.

select, where, order by, limit: первые запросы

select перечисляет нужные столбцы через запятую, select * берёт все. where оставляет строки, которые прошли условие. Условия соединяются через and и or, сравнения — =, != или <>, >, >=, <, <=. Для текста есть contains, starts with, ends with, like с подстановкой % и matches с регулярным выражением.

Крупные оплаченные заказы, от 5 000 ₽, по убыванию суммы — запрос из первой строки таблицы ниже. Он возвращает пять строк: Зайцева 9 900 и 9 400, Белов 7 300, Громов 5 200, Новиков 5 100. Отменённый заказ Громова на 8 600 ₽ в список не попал, хотя он крупнее трёх из пяти, — его отсёк статус.

order by сортирует по одному или нескольким столбцам, desc — по убыванию. limit 3 оставляет первые три строки результата, offset пропускает заданное число строк. Сортировка выполняется раньше, чем limit, поэтому «три самых крупных заказа» пишутся одним запросом. Фильтр и сортировка при этом не трогают исходный лист — в отличие от обычного фильтра в Google Таблицах, который скрывает строки у всех, кто открыл файл.

Данные — лист «Заказы»; во всех формулах третий аргумент 1
ВопросЗапрос (второй аргумент)Результат
Оплаченные от 5 000 ₽select C, F where G = 'Оплачен' and F >= 5000 order by F desc5 строк: 9 900, 9 400, 7 300, 5 200, 5 100
Три крупнейших оплаченныхтот же запрос и limit 39 900, 9 400, 7 300
Заказы Москвы через поискselect A, B, F where E = 'Москва' and D = 'Поиск'3 строки: 1001, 1004, 1010
Клиенты на «Л»select C, F where C starts with 'Л'2 строки Лаптевой: 1 500 и 3 900

group by и агрегаты: выручка по каналам

Самое полезное в QUERY — группировка. group by D собирает строки с одинаковым каналом, а агрегатная функция считает по каждой группе: sum, count, avg, min, max. Правило то же, что в SQL: всё, что стоит в select без агрегата, обязано стоять в group by, иначе QUERY вернёт ошибку.

Запрос ниже считает число оплаченных заказов и выручку по каналам и сортирует по выручке. Без label заголовки получатся служебными — «count Заказ» и «sum Сумма»; label даёт им человеческие имена. В order by можно сортировать по самому агрегату: order by sum(F) desc.

Поиск принёс 22 400 ₽ с пяти заказов, партнёры — 19 300 ₽ всего с двух. Средний чек у партнёров 9 650 ₽, у поиска 4 480 ₽: добавьте в select выражение avg(F) — и это видно в той же таблице. Сумма по четырём каналам — 58 500 ₽, ровно выручка оплаченных заказов. Сверять итог группировки с общей суммой стоит каждый раз: если строки выпадают из-за пустого канала или опечатки в статусе, расхождение покажет это сразу.

Результат формулы, приведённой под таблицей: оплаченные заказы по каналам
КаналЗаказовВыручка, ₽
Поиск522 400
Партнёры219 300
Email29 600
Соцсети37 200
codeФормула в ячейке: выручка оплаченных заказов по каналам
=QUERY(Заказы!A1:G16;
  "select D, count(B), sum(F)
   where G = 'Оплачен'
   group by D
   order by sum(F) desc
   label D 'Канал', count(B) 'Заказов', sum(F) 'Выручка'"; 1)

pivot: сводная таблица одной формулой

pivot разворачивает значения столбца в заголовки. select D, sum(F) group by D pivot G даёт таблицу «канал × статус»: в строках каналы, в столбцах статусы, на пересечении — сумма. Строки и столбцы идут по возрастанию значений, поэтому Email стоит выше кириллических каналов. Пустая ячейка значит, что таких заказов не было, а не ноль.

По этой таблице видно то, что пряталось в группировке по оплаченным: у партнёров отменён заказ на 8 600 ₽, почти половина их оборота, у Email — на 6 500 ₽. Тот же разрез можно собрать сводной таблицей в Google Таблицах, и для разового взгляда она удобнее. QUERY выигрывает, когда разрез нужен в отчёте: он описан текстом, его видно в формуле и легко скопировать на другой лист.

Результат `select D, sum(F) group by D pivot G`, ₽
КаналВозвратОплаченОтменён
Email9 6006 500
Партнёры19 3008 600
Поиск22 400
Соцсети2 7007 200

Даты в QUERY: литерал date и ловушка month()

Дату в условии нельзя написать как «01.10.2026». Язык запросов понимает только литерал date '2026-10-01' — слово date и строку в формате год-месяц-день. Оплаченные заказы октября: select count(B), sum(F) where G = 'Оплачен' and A >= date '2026-10-01' — 7 заказов на 34 800 ₽. Для закрытого периода ставьте две границы, A >= date '2026-09-01' and A < date '2026-10-01': так в отчёт не попадут будущие строки, и тот же шаблон сработает, если в столбце окажется время.

Обычно дата периода лежит в ячейке, и её надо вклеить в текст запроса. Число из ячейки превращается в нужную строку функцией ТЕКСТ: "… and A >= date '"&ТЕКСТ(J1;"yyyy-mm-dd")&"'". Кавычки здесь в три слоя, и ошибиться легко: одинарная кавычка открывает литерал внутри запроса, двойная закрывает кусок текста формулы, амперсанд приклеивает дату.

Вторая ловушка — функция month(). Она возвращает номер месяца с нуля: январь — 0, октябрь — 9. Запрос с where month(A) = 9 отберёт не сентябрь, а все восемь заказов октября, а month(A) = 10 — ноябрь, которого в данных нет. Ошибки при этом нет, результат выглядит правдоподобно. Для группировки по месяцам пишите month(A)+1 или группируйте по году и месяцу вместе: group by year(A), month(A).

Условия по датам на листе «Заказы»
Условие в whereЧто отберётРезультат
G = 'Оплачен' and A >= date '2026-10-01'оплаченные с 1 октября7 заказов, 34 800 ₽
G = 'Оплачен' and A >= date '2026-09-01' and A < date '2026-10-01'оплаченные сентября5 заказов, 23 700 ₽
month(A) = 9октябрь, а не сентябрь8 строк
A >= '2026-10-01'сравнение даты с текстомошибка запроса

Ссылка на ячейку и выпадающий список

Отчёт становится удобным, когда условие выбирают из списка. Поставьте в J2 выпадающий список каналов («Данные → Настроить проверку данных», правило «Раскрывающийся список») и соберите запрос из кусков: =QUERY(Заказы!A1:G16; "select A, C, F where D = '"&J2&"' and G = 'Оплачен'"; 1). Для «Партнёров» формула вернёт два заказа Зайцевой — 9 400 ₽ от 12 сентября и 9 900 ₽ от 15 октября.

Число вклеивается без одинарных кавычек: "where F >= "&J3. Текст — обязательно в них, иначе QUERY примет значение за имя столбца. Если в значении может встретиться апостроф, например в названии «Д'Артаньян», запрос сломается: такие значения лучше фильтровать функцией FILTER, а не QUERY.

QUERY по данным из другой таблицы: Col1 вместо буквы

Когда первым аргументом стоит диапазон листа, столбцы называются буквами листа. Если же данные — результат другой функции, букв у них нет, и столбцы нумеруются: Col1, Col2 и дальше, с большой C. Так происходит с IMPORTRANGE, с массивом в фигурных скобках и с выводом FILTER.

Пример с массивом: =QUERY({Заказы!A2:G16}; "select Col4, sum(Col6) group by Col4"; 0). Он считает все заказы по каналам вместе с отменами и возвратами: Email 16 100, Партнёры 27 900, Поиск 22 400, Соцсети 9 900 ₽. Тот же запрос с select D, sum(F) вернёт ошибку: столбца D в массиве нет.

Чаще всего Col-нотация нужна при сборе данных из нескольких файлов: =QUERY(IMPORTRANGE("ссылка"; "Заказы!A:G"); "select Col4, sum(Col6) where Col7 = 'Оплачен' group by Col4"; 1). Как дать доступ и почему импорт обновляется не мгновенно, разобрано в статье об IMPORTRANGE.

Почему QUERY возвращает пусто или неверную сумму

Смешанные типы в столбце — главная тихая ошибка. Справка Google описывает правило так: у столбца один тип, при смешении побеждает тот, которого больше, а остальные значения QUERY считает пустыми. Если сумма заказа 1014 пришла из выгрузки текстом «3900», столбец F остаётся числовым, а эта ячейка превращается в пустую. Выручка соцсетей по группировке станет 3 300 ₽ вместо 7 200 ₽, итог — 54 600 ₽ вместо 58 500 ₽, и никакого сообщения об ошибке не будет. Проверка простая: сравните sum(F) из QUERY с =СУММ(F2:F16) и =СЧЁТ(F2:F16) с числом строк.

Регистр. СУММЕСЛИ считает «москва» и «Москва» одним значением, QUERY — нет: where E = 'москва' не найдёт ни одной строки. Если в данных встречаются оба написания, сравнивайте через lower(E) = 'москва'.

Ошибка разбора запроса появляется, когда нарушен порядок частей (order by перед group by), столбец в select не вошёл в group by, текст оставлен без одинарных кавычек или в русской локали аргументы формулы разделены запятой. Сообщение под ячейкой обычно указывает, на каком слове запрос перестал читаться.

Симптом — причина — что сделать
СимптомПричинаЧто сделать
Сумма меньше, чем СУММ по столбцучисла как текст в числовом столбцепривести столбец к числу, сверить СЧЁТ и СЧЁТЗ
Пусто при явно подходящих строкахрегистр или пробел в текстеlower() в условии, СЖПРОБЕЛЫ в исходнике
Отобран не тот месяцmonth() считает с нуляmonth(A)+1 или две границы date
Ошибка «столбец не найден»буквы вместо Col1 после IMPORTRANGE или {}перейти на Col1, Col2
Две строки слиплись в заголовоктретий аргумент опущенуказать 1 или 0 явно
Ошибка разбора запросапорядок частей, кавычки, group byсверить порядок select → where → group by → pivot → order by

QUERY и SQL: что совпадает, а чего нет

Язык QUERY — урезанный SQL. Почти всё из таблицы ниже переносится в базу данных без изменений, кроме двух вещей: в QUERY нет FROM, потому что источник задан первым аргументом, и нет JOIN — соединить две таблицы внутри запроса нельзя. Нет и оконных функций, подзапросов, HAVING. Отбор по агрегату обходят вложенной QUERY: внутренняя группирует, внешняя фильтрует по Col2.

Отсюда практическое правило. Пока данные помещаются в Таблицу и запрос укладывается в «отбери — сгруппируй — отсортируй», QUERY закрывает задачу. Когда нужно соединять таблицы, считать retention или работать с сотнями тысяч строк, аналитик уходит в SQL. Запрос ниже — тот же group by с условием по дате на учебной базе «Маяк»; его можно выполнить в песочнице Симулятора SQL-аналитика.

Соответствие QUERY и SQL
В QUERYВ SQLРазница
select D, sum(F)SELECT channel, SUM(amount)буквы столбцов вместо имён
первый аргументFROM paymentsисточник задаётся вне запроса
where A >= date '2026-10-01'WHERE paid_at >= DATE '2026-10-01'в SQL слово DATE, в QUERY date
group by DGROUP BY channelто же правило для столбцов в select
pivot GSUM(CASE WHEN …) по каждому значениюв PostgreSQL отдельного PIVOT нет
label sum(F) 'Выручка'AS revenueподпись задаётся в конце запроса
нетJOIN, HAVING, окна, подзапросыв QUERY их заменяют вложенные формулы
Платежи за июль 2026 по тарифам: аналог group by с условием по дате
SELECT
  plan,
  COUNT(*) AS payments,
  SUM(amount) AS revenue
FROM payments
WHERE paid_at >= DATE '2026-07-01'
  AND paid_at < DATE '2026-08-01'
GROUP BY plan
ORDER BY revenue DESC;

Результат запроса на базе «Маяк»

Три строки, суммы в долларах. В Google Таблице с выгрузкой платежей тот же ответ дала бы формула =QUERY(Платежи!A:F; "select E, count(A), sum(D) where C >= date '2026-07-01' and C < date '2026-08-01' group by E order by sum(D) desc"; 1) — при условии, что столбцы выгрузки идут в порядке payment_id, user_id, paid_at, amount, plan. Синтаксис групп, условий и сортировки одинаковый, поэтому человек, освоивший QUERY, читает такой SQL с первого раза. Подробнее — в статьях о GROUP BY и COUNT и о SELECT, FROM и WHERE.

payments, июль 2026
planpaymentsrevenue
basic2464 674
pro1454 205
team511 989

Частые вопросы

Как в QUERY сослаться на ячейку?

Разорвите текст запроса и вклейте значение амперсандом: "where D = '"&J2&"'" для текста, "where F >= "&J3 для числа. Дату переводите в строку функцией ТЕКСТ(J1;"yyyy-mm-dd") и ставьте после слова date.

Почему QUERY не видит часть чисел?

В столбце смешаны числа и текст. QUERY оставляет тип, которого больше, а значения другого типа считает пустыми. Приведите столбец к одному типу и сверьте сумму QUERY с обычной СУММ.

Можно ли в QUERY соединить две таблицы, как JOIN?

Нет, JOIN в языке запросов нет. Справочник подтягивают к данным формулой ВПР или XLOOKUP в отдельном столбце, а потом группируют QUERY. Как это делается, показано в статье о ВПР в Google Таблицах.

Чем QUERY отличается от FILTER?

FILTER только отбирает строки по условиям и возвращает их как есть. QUERY умеет ещё выбирать столбцы, группировать, разворачивать pivot и сортировать. Для простой выборки FILTER проще и не требует кавычек в три слоя.

Есть ли QUERY в Excel?

Такой функции в Excel нет. Ближайшие замены — Power Query, сводные таблицы и связка ФИЛЬТР, СОРТ и УНИК в новых версиях. Подробнее о первой — в статье о Power Query.

Итог

QUERY превращает лист Google Таблицы в маленькую базу данных: одна формула отбирает, группирует и сортирует, и отчёт пересчитывается вместе с данными. Пишите заголовки третьим аргументом явно, текст в запросе — в одинарных кавычках, даты — литералом date, после IMPORTRANGE переходите на Col1. Каждый новый запрос сверяйте с СУММ по исходнику: смешанные типы и регистр не дают ошибки, они дают другое число. Когда упрётесь в JOIN и окна, переходите на SQL: в курсе «SQL с нуля» первые 10 уроков бесплатно, а задачи на базе продукта ждут в Симуляторе SQL-аналитика.

Продолжить чтение
Вся библиотека