Функция QUERY в Google Таблицах: синтаксис, примеры и ошибки
QUERY в Google Таблицах на одном листе заказов: select, where, group by, pivot, даты, ссылки на ячейки, Col1 с IMPORTRANGE и ошибки. Каждый результат пересчитан.
Содержание статьи
Руководитель просит отчёт: выручка по каналам за октябрь, только оплаченные заказы, крупные — отдельным списком. В 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'. Если дата пришла из выгрузки строкой, её сначала нужно превратить в дату — об этом в разделе об ошибках.
| Стр. | A: Дата | B: Заказ | C: Клиент | D: Канал | E: Город | F: Сумма, ₽ | G: Статус |
|---|---|---|---|---|---|---|---|
| 2 | 02.09.2026 | 1001 | Орлова | Поиск | Москва | 4 200 | Оплачен |
| 3 | 03.09.2026 | 1002 | Ким | Соцсети | Казань | 1 800 | Оплачен |
| 4 | 05.09.2026 | 1003 | Белов | Москва | 6 500 | Отменён | |
| 5 | 09.09.2026 | 1004 | Орлова | Поиск | Москва | 3 100 | Оплачен |
| 6 | 12.09.2026 | 1005 | Зайцева | Партнёры | Пермь | 9 400 | Оплачен |
| 7 | 18.09.2026 | 1006 | Ким | Соцсети | Казань | 2 700 | Возврат |
| 8 | 24.09.2026 | 1007 | Громов | Поиск | Пермь | 5 200 | Оплачен |
| 9 | 01.10.2026 | 1008 | Белов | Москва | 7 300 | Оплачен | |
| 10 | 04.10.2026 | 1009 | Лаптева | Соцсети | Москва | 1 500 | Оплачен |
| 11 | 08.10.2026 | 1010 | Орлова | Поиск | Москва | 4 800 | Оплачен |
| 12 | 11.10.2026 | 1011 | Громов | Партнёры | Пермь | 8 600 | Отменён |
| 13 | 15.10.2026 | 1012 | Зайцева | Партнёры | Пермь | 9 900 | Оплачен |
| 14 | 19.10.2026 | 1013 | Ким | Казань | 2 300 | Оплачен | |
| 15 | 22.10.2026 | 1014 | Лаптева | Соцсети | Москва | 3 900 | Оплачен |
| 16 | 26.10.2026 | 1015 | Новиков | Поиск | Казань | 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 Таблицах, который скрывает строки у всех, кто открыл файл.
| Вопрос | Запрос (второй аргумент) | Результат |
|---|---|---|
| Оплаченные от 5 000 ₽ | select C, F where G = 'Оплачен' and F >= 5000 order by F desc | 5 строк: 9 900, 9 400, 7 300, 5 200, 5 100 |
| Три крупнейших оплаченных | тот же запрос и limit 3 | 9 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 ₽, ровно выручка оплаченных заказов. Сверять итог группировки с общей суммой стоит каждый раз: если строки выпадают из-за пустого канала или опечатки в статусе, расхождение покажет это сразу.
| Канал | Заказов | Выручка, ₽ |
|---|---|---|
| Поиск | 5 | 22 400 |
| Партнёры | 2 | 19 300 |
| 2 | 9 600 | |
| Соцсети | 3 | 7 200 |
=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 выигрывает, когда разрез нужен в отчёте: он описан текстом, его видно в формуле и легко скопировать на другой лист.
| Канал | Возврат | Оплачен | Отменён |
|---|---|---|---|
| 9 600 | 6 500 | ||
| Партнёры | 19 300 | 8 600 | |
| Поиск | 22 400 | ||
| Соцсети | 2 700 | 7 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 | Разница |
|---|---|---|
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 D | GROUP BY channel | то же правило для столбцов в select |
pivot G | SUM(CASE WHEN …) по каждому значению | в PostgreSQL отдельного PIVOT нет |
label sum(F) 'Выручка' | AS revenue | подпись задаётся в конце запроса |
| нет | JOIN, HAVING, окна, подзапросы | в QUERY их заменяют вложенные формулы |
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.
| plan | payments | revenue |
|---|---|---|
| basic | 246 | 4 674 |
| pro | 145 | 4 205 |
| team | 51 | 1 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-аналитика.
Материалы по теме
IMPORTRANGE в Google Таблицах: данные из другой таблицы
Функция IMPORTRANGE: как подтянуть данные из другой Google Таблицы, дать доступ, объединить несколько файлов, обработать импорт через QUERY и не сломать отчёт.
Сводная таблица в Google Таблицах: как сделать и не ошибиться
Как сделать сводную таблицу в Google Таблицах: строки, столбцы, значения, фильтры, группировка по месяцам, доли, вычисляемое поле и ловушки уникальных и средних.
ВПР в Google Таблицах: формула, примеры, XLOOKUP
Функция ВПР в Google Таблицах: синтаксис, ЛОЖЬ вместо значения по умолчанию, #Н/Д, поиск влево через массив, XLOOKUP, ИНДЕКС и ПОИСКПОЗ и ВПР на весь столбец.