#sql #google-bigquery
#sql #google-bigquery
Вопрос:
В Google BigQuery я хотел бы свернуть показатели на основе определенных измерений (в данном случае по кампании и партнеру). Когда я использую приведенный ниже код, я получаю сообщение об ошибке:
Выражение ‘a.genre’ отсутствует в списке ГРУППИРОВАТЬ ПО.
Может кто-нибудь, пожалуйста, посоветовать, что мне нужно исправить в моем скрипте? Спасибо!
Пожалуйста, смотрите ниже пример таблицы (не обращайте внимания на то, что заголовки в таблице ниже не совсем соответствуют предоставленному скрипту):
SELECT
SUM(a.amount) totalcost,
a.campaign_name,
c.friendly_campaign,
p.friendly_partner_name,
a.partner_name,
a.genre,
a.season,
a.package
FROM
[TABLE 1] a
LEFT OUTER JOIN
[TABLE 2] p
ON
a.partner_name = p.raw_partner_name
LEFT OUTER JOIN
[TABLE 3] c
ON
a.campaign_name = c.campaign
GROUP BY ROLLUP(c.friendly_campaign, p.friendly_partner_name)
Ответ №1:
В SQL, в общем случае, — если вы агрегируете с использованием групп — вы должны решить, будет ли поле в вашем операторе select агрегироваться или является группой. Вы не можете просто оставить это там без какого-либо контекста. Итак, в вашем случае вы, вероятно, захотите либо удалить все остальные поля
SELECT
SUM(a.amount) totalcost,
c.friendly_campaign,
p.friendly_partner_name,
FROM
[TABLE 1] a
LEFT OUTER JOIN
[TABLE 2] p
ON
a.partner_name = p.raw_partner_name
LEFT OUTER JOIN
[TABLE 3] c
ON
a.campaign_name = c.campaign
GROUP BY ROLLUP(c.friendly_campaign, p.friendly_partner_name)
или добавьте их как группы, в которые вы агрегируете a.amount
:
SELECT
SUM(a.amount) totalcost,
a.campaign_name,
c.friendly_campaign,
p.friendly_partner_name,
a.partner_name,
a.genre,
a.season,
a.package
FROM
[TABLE 1] a
LEFT OUTER JOIN
[TABLE 2] p
ON
a.partner_name = p.raw_partner_name
LEFT OUTER JOIN
[TABLE 3] c
ON
a.campaign_name = c.campaign
GROUP BY ROLLUP(2,3,4,5,6,7,8)