Конструкция CASE WHEN в GBQ предназначена для выбора значения по одному или нескольким условия.
Когда условий несколько (IF ELSEIF) то конструкция выглядит следующим образом:
CASE WHEN (УСЛОВИЕ_1) THEN 'значение_1' WHEN (УСЛОВИЕ_2) THEN 'значение_2' WHEN (УСЛОВИЕ_3) THEN 'значение_3' ELSE 'значение по-умолчанию' END AS `название_столбца`
Читается данная конструкция так
если случилось УСЛОВИЕ_1, то значение установить значение_1, иначе если случилось УСЛОВИЕ_2, то значение установить значение_2, иначе если случилось УСЛОВИЕ_3, то значение установить значение_3, иначе значение значение по умолчанию
Пример ниже, считает число событий web_add_to_cart (добавлений в корзину) для отдельных страниц и определяет тип страниц по условию в конструкции CASE WHEN:
SELECT `e`.value.string_value AS `url`, COUNT(`user_pseudo_id`) AS `cnt`, CASE WHEN REGEXP_EXTRACT(`e`.value.string_value, r'product') IS NOT NULL THEN 'product' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'catalog') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/l/') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/s/') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'actions') IS NOT NULL THEN 'actions' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'blogs') IS NOT NULL THEN 'blogs' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/search') IS NOT NULL THEN 'search' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/cart') IS NOT NULL THEN 'cart' ELSE 'other' END AS `url_type` FROM `firebase-buysiberian.analytics_XXX.events_2023*`, UNNEST(`event_params`) AS `e` WHERE `event_name` = 'web_add_to_cart' AND `e`.value.string_value LIKE 'https://mysite.ru/%' AND `e`.key = 'page_location' GROUP BY `e`.value.string_value
Результат запроса
Изображение 1. Результат определения типа URL конструкцией CASE WHEN
Практический пример
Допустим мы хотим рассчитать конверсию корзин по просмотрам страниц определенных групп, напишем для этого запрос:
WITH `web_add_to_cart_cnt` AS (SELECT `e`.value.string_value AS `url`, COUNT(`user_pseudo_id`) AS `cnt`, CASE WHEN REGEXP_EXTRACT(`e`.value.string_value, r'product') IS NOT NULL THEN 'product' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'catalog') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/l/') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/s/') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'actions') IS NOT NULL THEN 'actions' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'blogs') IS NOT NULL THEN 'blogs' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/search') IS NOT NULL THEN 'search' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/cart') IS NOT NULL THEN 'cart' ELSE 'other' END AS `url_type` FROM `firebase-buysiberian.analytics_XXX.events_20230710`, UNNEST(`event_params`) AS `e` WHERE `event_name` = 'web_add_to_cart' AND `e`.key = 'page_location' GROUP BY `e`.value.string_value), `page_view_cnt` AS (SELECT `e`.value.string_value AS `url`, COUNT(`user_pseudo_id`) AS `cnt`, CASE WHEN REGEXP_EXTRACT(`e`.value.string_value, r'product') IS NOT NULL THEN 'product' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'catalog') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/l/') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/s/') IS NOT NULL THEN 'catalog' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'actions') IS NOT NULL THEN 'actions' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'blogs') IS NOT NULL THEN 'blogs' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/search') IS NOT NULL THEN 'search' WHEN REGEXP_EXTRACT(`e`.value.string_value, r'shop/cart') IS NOT NULL THEN 'cart' ELSE 'other' END AS `url_type` FROM `firebase-buysiberian.analytics_XXX.events_20230710`, UNNEST(`event_params`) AS `e` WHERE `event_name` = 'page_view' AND `e`.key = 'page_location' GROUP BY `e`.value.string_value) SELECT `web_add_to_cart_cnt`.`url_type`, SUM(`web_add_to_cart_cnt`.`cnt`) / SUM(`page_view_cnt`.`cnt`) FROM `web_add_to_cart_cnt` LEFT JOIN `page_view_cnt` ON (`page_view_cnt`.`url` = `web_add_to_cart_cnt`.`url`) GROUP BY `url_type`
Таблица web_add_to_cart_cnt – количество событий web_add_to_cart по URL с указанием его типа, таблица page_view_cnt – количество событий page_view по URL с указанием его типа и агрегирующая итоговая таблица с подсчетом конверсии сгруппированная по типам страниц.
Результат запроса:
Изображение 2. Результат подсчета конверсии корзины к просмотрам по типа URL конструкцией CASE WHEN