【问题标题】:SQL Combine multiple different rows into one rowSQL 将多个不同的行合并为一行
【发布时间】:2020-04-19 17:28:07
【问题描述】:

这是我的查询:

SELECT
      basic_all_levels.date,
      basic_all_levels.account_id,
      basic_all_levels.ad_id,
      basic_all_levels.inline_link_clicks AS link_clicks,
      basic_all_levels.reach,
      basic_all_levels.spend AS cost,
      fb_basic_all_levels_cost_per_action_type.action_type,
      fb_basic_all_levels_cost_per_action_type.value,
      CASE WHEN (spend > 0) AND action_type = 'landing_page_view'
          THEN spend / value
          ELSE 0 END AS landing_page_views,
      CASE WHEN (spend > 0) AND action_type = 'offsite_conversions_fb_pixel_purchase'
          THEN  spend / value
          ELSE 0 END AS purchases,


  FROM `x.facebook_ad_insights.fb_basic_all_levels` AS basic_all_levels
  LEFT JOIN `x.facebook_ad_insights.fb_basic_all_levels_cost_per_action_type` AS fb_basic_all_levels_cost_per_action_type
      ON basic_all_levels.ad_id = fb_basic_all_levels_cost_per_action_type.ad_id and basic_all_levels.date = fb_basic_all_levels_cost_per_action_type.date

这是我的结果

我只想要一行,如下所示:

我不需要“值”列,因为我可以重新计算它。

我查看了很多问题,但我不明白如何汇总,因为: - 分组不起作用。它说:“登陆页面视图”既不分组也不聚合 - 我检查了我的“左连接”并尝试看看是否存在更合适的东西 - 我看到了一个数据透视函数,但我只想选择特定值(登陆页面浏览量和购买,而不是全部列在操作类型列中。

【问题讨论】:

  • 你的问题没有意义。 作为文本表格的示例数据和所需结果会有所帮助。我对这种说法特别困惑:“group by 不起作用,因为我需要聚合”。
  • 感谢@GordonLinoff 我已经用预期的样本结果编辑了这个问题。我通过控制台中的错误更改了“group by 不起作用”。
  • spend属于哪个表字段?
  • @MikhailBerlyant basic_all_levels.spend。我编辑了我的查询以更精确。谢谢

标签: sql google-bigquery


【解决方案1】:

我会使用以下版本(BigQuery 标准 SQL)

#standardSQL
SELECT
  basic_all_levels.date,
  basic_all_levels.account_id,
  basic_all_levels.ad_id,
  basic_all_levels.inline_link_clicks AS link_clicks,
  basic_all_levels.reach,
  basic_all_levels.spend AS cost,
  IF(landing_page_views > 0, spend / landing_page_views, 0) AS landing_page_views,
  IF(purchases > 0, spend / purchases, 0) AS purchases
FROM `x.facebook_ad_insights.fb_basic_all_levels` AS basic_all_levels
LEFT JOIN (
  SELECT
    ad_id,
    `date`,
    SUM(IF(action_type = 'landing_page_view', value, 0)) AS landing_page_views,
    SUM(IF(action_type = 'offsite_conversions_fb_pixel_purchase', value)) AS purchases
  FROM `x.facebook_ad_insights.fb_basic_all_levels_cost_per_action_type`
  GROUP BY ad_id, `date`
) AS fb_basic_all_levels_cost_per_action_type
USING(ad_id, `date`)   

与第一个 JOIN'ing 然后 GROUP'ing 的版本相比应该更优化

【讨论】:

    【解决方案2】:

    我认为您正在寻找聚合。尽我所能:

    SELECT bal.date, bal.account_id, bal.ad_id,
           spend as cost,
           SUM(CASE WHEN spend > 0 AND action_type = 'landing_page_view'
                    THEN spend / value ELES 0
               END) AS landing_page_views,
           SUM(CASE WHEN spend > 0 AND action_type = 'offsite_conversions_fb_pixel_purchase'
                    THEN  spend / value ELSE 0
               END) AS purchases
    FROM `x.facebook_ad_insights.fb_basic_all_levels` bal LEFT JOIN
         `x.facebook_ad_insights.fb_basic_all_levels_cost_per_action_type` balcat       
         ON bal.ad_id = balcat.ad_id AND
            bal.date = balcat.date
    GROUP BY bal.date, bal.account_id, bal.ad_id, spend;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 2022-01-21
      • 2012-05-27
      相关资源
      最近更新 更多