Данная шпаргалка создана на основе материалов:
Справка по языку запросов API визуализации Google
Подробнейшее руководство от Netpeak (в этой статье есть практические задания)
Форматирование чисел и дат в query
Небольшая статья по query
Статьи по Гугл Докс
=QUERY(данные; запрос; [заголовки])
Данные — диапазон ячеек, для которого нужно выполнить запрос.
Запрос — запрос на выполнение, записанный на языке запросов API визуализации Google (упрощенный вариант SQL-запросов).
Значение параметра запрос должно быть заключено в кавычки или представлять собой ссылку на ячейку, содержащую соответствующий текст.
Заголовки (необязательный параметр) — указываем сколько первых строк будет считаться заголовками. В случае, если параметр опущен или равен -1, его значение вычисляется автоматически в зависимости от содержимого данных.
=query(DB!$A$1:$L$1143;
"select * limit 10")
На примере выше мы выбираем данные из указанного диапазона и в запросе указываем, что хотим получить все столбцы. «Limit» означает, что будет выведено всего 10 первых строк.
=QUERY(data!$A:$I;
"select A,sum(D)
where (B contains 'YRSY' or B contains 'YSEA')
group by A")
В данной формуле указывается диапазон, откуда берём данные. В запросе мы пишем, что хотим получить (под запросом имеется в виду то, что идёт в двойных кавычках). Если поочередно, то в запросе указывается следующее:
Если в последнюю формулу не добавить группировку, то вылетит ошибка.
В большинстве случаев подобные «подсказки» дают нам представление о том, что пошло не так и где это нужно исправить.
Для того, чтобы выбрать данные с которыми мы хотим работать — мы используем ключевое слово (кляузу) select.
По ссылке можно скопировать базу данных для тестов. Данные в базе вымышлены и все возможные совпадения случайны.
В первой части формулы мы выбираем диапазон с данными.
Во второй части мы в кавычках уже начинаем писать запрос. Все запросы начинаются с кляузы select.
Если в файле для тренировки вы напишите формулу, то будут выведен список всех РК.
=query(data!$A:$I;"select B")
В кляузе select мы перечисляем столбцы, которые нужно выбрать и сделать с ними что-то — либо вывести всё, либо отфильтровать, либо суммировать, либо разделить и т.д.
Таким образом выглядит часть данных, которые находятся в файле для тестов.
Если мы применим запрос, который указан выше, то будут выведены все значения из столбца B.
С помощью where можно фильтровать данные, которые содержит определенный столбец.
Например,
=QUERY(data!$A:$I;
"select A,sum(D)
where (B contains 'YRSY' or B contains 'YSEA')
group by A")
В данном случае, с помощью where мы фильтруем кампании, которые содержат «YRSY» или «YSEA».
Кляуза WHERE поддерживает логические операторы OR и AND и определенные ключевые слова с помощью которых можно фильтроваться.
Операторы =, <, > и != можно применять в том числе для строк. Но рекомендую использовать только = и !=, так как в случае с операторами «больше” или «меньше» — поведение не очень предсказуемое.
Оператор | Описание |
---|---|
= | Равно |
< | Меньше |
> | Больше |
!= | Не равно |
AND | Логическое «И». Т.е. все условия через И должны быть соблюдены. |
OR | Логическое «ИЛИ». Должно быть выполнено одно из условий. |
NOT | Логическое отрицание. Например, «not contains» в where будет означать «не содержит» |
contains | Проверяет содержание определённых символов в строке. Например, WHERE A contains 'John' вернёт в фильтр все значения из столбца A, в которых встречается John, например, John Adams, Long John Silver. |
starts with | Фильтрует значения по префиксу, то есть проверяет символы в начале строки. Например, starts with 'en' вернёт значения engineering и english. |
ends with | Фильтрует значения по окончанию строки. Например, строка 'cowboy' будет возвращена конструкцией «ends with 'boy'» или «ends with 'y'» |
matches | Соответствует регулярному выражению. Например: where matches ‘.*ia’ вернёт значения India и Nigeria. |
like | Упрощённая версия регулярных выражений, проверяет соответствия строки заданному выражению с использованиям символов подстановки. На данный момент like поддерживает два символа подстановки: «%» означает любое количество любых символов в строке, и «_» — означает один любой символ. Например, «where name like ‘fre%’» будет соответствовать строкам ‘fre’, ‘fred’, и ‘freddy’. |
Для того, чтобы отсортировать данные по убыванию или возрастанию, то нужно добавить кляузу order by.
По умолчанию — порядок asc, то есть по возрастанию. Если укажете после названия поля параметр desc, запрос вернет результат в порядке убывания указанных в кляузе Order by полей.
Вот так мы выводим 5 самых конверсионных кампаний за весь период:
=query(data!$A:$I;
"select B, sum(G)
group by B
order by sum(G)
desc
limit 5")
Результат выглядит вот так:
В примерах выше очень часто используется функция sum(), которая отвечает за суммирование данных из указанного столбца.
Помимо суммирования можно возвращать минимальное и максимальное значение, среднее значение или подсчитать количество значений в группе.
Функция | Описание | Поддерживаемый тип данных | Возвращаемый тип данных |
---|---|---|---|
avg() | Возвращает среднее значение для группы | Числовой | Числовой |
count() | Возвращает количество значений в группе | Любой | Числовой |
max() | Возвращает максимальное значение для группы | Любой | Аналогичный полю, к которому применяется |
min() | Возвращает минимальное значение для группы | Любой | Аналогичный полю, к которому применяется |
sum() | Возвращает сумму значений в группе | Числовой | Числовой |
В случаях, когда используются агрегирующие функции, то указание group by обязательно. Иначе гугл выдаст ошибку.
=query(data!$A:$I;
"select B, sum(G)")
Обычно в ошибке указывается, что пошло не так. Если добавим группировку по кампаниям, то всё будет ок.
=query(data!$A:$I;
"select B, sum(G) group by B")
Предположим, в таблице нам нужно вывести данные по всем кампаниям, показам, кликам, CTR, расходам, конверсиям, посчитать CPA и вывести с сортировкой CPA по убыванию.
Мы это можем сделать с помощью следующей формулы:
=query(data!$A:$I;
"select B, sum(D), sum(E), sum(E)/sum(D), sum(F), sum(G), sum(F)/sum(G)
group by B
order by sum(F)/sum(G)
desc")
В перечислении в кляузе select мы показываем какие столбцы хотим видеть. Здесь можно использовать, в том числе и арифметические операторы.
Оператор | Описание |
---|---|
+ | Сложение |
- | Вычетание |
/ | Деление |
* | Умножение |
В результате работы формулы мы получим следующий результат (количество данных на скрине сократил, чтобы лучше было видно).
В случае со столбцом B, query взял в качестве заголовка 1 строку из нашей базы данных, где было указано «Название размещения». По остальным столбцам в заголовках добавилось указание первой строки из БД + название арифметической операции, которая использовалась для данного столбца.
Для того, чтобы это исправить и сделать более красиво, используется кляуза label.
Вот как выглядит формула с использованием этой кляузы:
=query(data!$A:$I;
"select B, sum(D), sum(E), sum(E)/sum(D), sum(F), sum(G), sum(F)/sum(G)
group by B order by sum(F)/sum(G)
desc
label B 'Кампания', sum(D) 'Показы', sum(E) 'Клики', sum(E)/sum(D) 'CTR, %', sum(F) 'Расход (без НДС)', sum(G) 'Конверсии', sum(F)/sum(G) 'CPA'
")
После слова label мы начинаем перечислять столбцы, которые указывали в «селекте» и задавать им значения, которые нам нужны.
Подобные перечисления разделяются между собой запятой. Если запятую пропустим, то query вернет ошибку.
Вот так теперь выглядят заголовки таблицы после использования label:
Форматировать данные можно с помощью двух способов:
На примере ниже видно, что в столбце, где мы рассчитали CTR, нужно данные форматировать в проценты:
И делаем мы это либо с помощью волшебной кнопки.
Либо меняем формулу из предыдущего примера на следующую:
=query(data!$A:$I;
"select B, sum(D), sum(E), sum(E)/sum(D), sum(F), sum(G), sum(F)/sum(G)
group by B order by sum(F)/sum(G)
desc
label B 'Кампания', sum(D) 'Показы', sum(E) 'Клики', sum(E)/sum(D) 'CTR, %', sum(F) 'Расход (без НДС)', sum(G) 'Конверсии', sum(F)/sum(G) 'CPA'
format sum(E)/sum(D) '0.00%'
")
В формуле появилась кляуза, которая приводит CTR в нужный нам вид:
format sum(E)/sum(D) '0.00%'
Аналогичные операции можно сделать и для других столбцов.
И итоговая формула будет выглядеть у нас следующим образом:
=query(data!$A:$I;
"select B, sum(D), sum(E), sum(E)/sum(D), sum(F), sum(G), sum(F)/sum(G)
group by B order by sum(F)/sum(G) desc
label B 'Кампания', sum(D) 'Показы', sum(E) 'Клики', sum(E)/sum(D) 'CTR, %', sum(F) 'Расход (без НДС)', sum(G) 'Конверсии', sum(F)/sum(G) 'CPA'
format sum(D) '### ### ###', sum(E) '### ### ###', sum(E)/sum(D) '0.00%', sum(F) '### ### ### руб', sum(G) '### ### ###0', sum(F)/sum(G) '##,## руб'
")
Теперь выглядит всё еще лучше:
Единственное, что раздражает — если происходит ошибка деления на ноль (в случае с CPA), то остаются пустые ячейки.
Предположим, что мы хотим создать таблицу, где по дням недели будут суммироваться конверсии.
Сделать мы это можем с помощью следующей формулы:
=query(data!$A:$I;
"select dayofweek(A), sum(G)
where B != ''
group by dayofweek(A) label dayofweek(A) 'День недели', sum(G) 'Конверсии'")
В итоге, получаем простую таблицу, где складываются все конверсии.
Неделя в данном случае начинается с воскресенья. Соответственно, у воскресенья порядковый номер = 1, а у субботы = 7.
Чтобы не запутать себя и окружающих, будет лучше отформатировать дни недели и привести их в привычный вид. Для этого в формулу нужно добавить кляузу format.
format dayofweek(A) 'dddd'
Теперь таблица выглядит понятнее:
Итоговая формула:
=query(data!$A:$I;
"select dayofweek(A), sum(G)
where B != ''
group by dayofweek(A)
label dayofweek(A) 'День недели', sum(G) 'Конверсии' format dayofweek(A) 'dddd'")
В эту формулу был добавлен фильтр, который проверяет ячейки, где вместо кампании пустая строка.
Помимо функции dayofweek(), существуют и другие, которые мы можем применять в наших запросах.
Функция | Описание |
---|---|
year() | Возвращает номер года из «даты» или «даты и времени». Пример: year(date ‘2009-02-05’) вернет 2009. Запрашиваемые параметры: один параметр с типом дата или дата и время. Тип возвращаемых данных: число. |
month() | Возвращает номер месяца из «даты» или «даты и времени». Но в данном случае январь будет возвращать 0, февраль 1 и так далее. Началом отсчета для номера месяца является 0. Пример: month(date ‘2009-02-05’) вернет 1. Чтобы функция вернула номер месяца в привычном виде к ее результату прибавьте 1, month(date "2009-02-05")+1 вернет 2. Запрашиваемые параметры: один параметр с типом дата или дата и время. Тип возвращаемых данных: число |
day() | Возвращает номер дня в месяце из «даты» или «даты и времени». Пример: day(date ‘2009-02-05’) вернет 5. Запрашиваемые параметры: один параметр с типом дата или дата и время. Тип возвращаемых данных: число. |
hour() | Возвращает номер часа в дне из «даты и времени» или «времени». Пример: hour(timeofday ‘12:03:17') вернет 12. Запрашиваемые параметры: один параметр с типом время или дата и время. Тип возвращаемых данных: число. |
minute() | Возвращает номер минуты в часе из «даты и времени» или «времени». Пример: minute(timeofday ‘12:03:17') вернет 3. Запрашиваемые параметры: один параметр с типом время или дата и время. Тип возвращаемых данных: число. |
second() | Возвращает номер секунды в минуте из «даты и времени» или «времени». Пример: second(timeofday ‘12:03:17') вернет 17. Запрашиваемые параметры: один параметр с типом время или дата и время. Тип возвращаемых данных: число. |
millisecond() | Возвращает номер миллисекунды в секунде из «даты и времени» или «времени». Пример: millisecond(timeofday ‘12:03:17.123') вернет 123. Запрашиваемые параметры: один параметр с типом время или дата и время. Тип возвращаемых данных: число. |
quarter() | Возвращает номер квартала в году из «даты и времени» или «времени». Базовым значением или началом отсчета является 1, соответственно, для первого квартала функция вернет значение 1, для второго 2 и так далее. Пример: quarter(date ‘2009-02-05’) вернет 1. Запрашиваемые параметры: один параметр с типом дата или дата и время. Тип возвращаемых данных: число. |
dayOfWeek() | Возвращает номер дня недели в неделе из «даты» или «даты и времени». Началом недели считается воскресенье, для воскресенья функция вернет значение 1, для понедельника 2 и так далее. Пример: dayOfWeek(date ‘2015-11-10’) вернет 3, так как 10 ноября 2015 года - вторник. Запрашиваемые параметры: один параметр с типом дата или дата и время. Тип возвращаемых данных: число. |
now() | Возвращает текущую дату и время в часовом поясе GTM. Запрашиваемые параметры: не требует ввода параметров. Тип возвращаемых данных: дата и время. |
dateDiff() | Возвращает разницу в днях между двумя датами. Пример: dateDiff(date ‘2008-03-13’ , date ‘2008-02-12’) вернет 29, так как 10 ноября 2015 года вторник. Запрашиваемые параметры: два параметра с типом «дата» или «дата и время». Тип возвращаемых данных: число. |
toDate() | Возвращает преобразованное в дату значение из «даты» или «даты и времени» или «числа». Пример: toDate(dateTime‘2013-03-13 11:19:22’) вернет дату ‘2013-03-13’. Запрашиваемые параметры: один параметр с типом дата, дата и время или число. Тип возвращаемых данных: дата. |
upper() | Преобразует все значения в строке в верхний регистр. Пример: upper( ‘foo') вернет строку ‘FOO’. Запрашиваемые параметры: один параметр с текстовым типом данных. Тип возвращаемых данных: текст. |
lower() | Преобразует все значения в строке в нижний регистр. Пример: upper( ‘Bar') вернет строку ‘bar’. Запрашиваемые параметры: один параметр с текстовым типом данных. Тип возвращаемых данных: текст. |
Чуть больше информации об этой кляузе есть в статье от netpeak, здесь приведу пример того, как мы можем использовать эту кляузу.
Задача:
Нужно по кампаниям построить таблицу, где по дням будет видна динамика конверсий, чтобы вовремя отслеживать проблемы.
Сделаем мы это с помощью следующего запроса:
=query(data!$A:$I;
"select B, sum(G)
where B != ''
group by B pivot A")
В итоге, получается матрица, которую можно использовать для анализа: