如何在标准sql-大查询中将一列拆分为多列

Posted

技术标签:

【中文标题】如何在标准sql-大查询中将一列拆分为多列【英文标题】:How to split one single column to multiple columns in Standard sql- Big query 【发布时间】:2018-08-28 08:05:47 【问题描述】:

使用 Google BigQuery

  WITH prep AS (
  SELECT 
  SPLIT(offer.name, '-') AS split,
  id
  FROM `hasoffer.offers_new` AS offer
  )

 SELECT *
 FROM
 (
  SELECT
  split[SAFE_ORDINAL(1)] AS Game,
  split[SAFE_ORDINAL(2)] AS GEO,
  IF ( REGEXP_CONTAINS ('INTERNAL - POGED',offers.name), "POGED", 
  IF(REGEXP_CONTAINS ('INTERNAL',offers.name), "Internal", IF( 
  REGEXP_CONTAINS('REDIRECT',offers.name), "REDIRECT", "Public"))) AS 
  Category,
  DATE(conv.datetime) AS Date,
  (SUM(conv.revenue_cents)/100) AS Revenue
  FROM `hasoffer.offers_new` AS offers
  LEFT JOIN
  prep
  ON
  offers.id=prep.id
  LEFT JOIN
  `hasoffer.conversions` AS conv
  ON offers.id = conv.offer_id
  WHERE 
  conv.advertiser_id = 632 
  AND EXTRACT(MONTH FROM conv.datetime) = EXTRACT(MONTH FROM CURRENT_DATE())
  AND EXTRACT(YEAR FROM conv.datetime) = 2018
  AND conv.status != 'rejected'
  AND conv.affiliate_sub1 IS NOT NULL
  group by
  GEO,
  Game,
  Category,
  Date
  order by
  Date)AS SourceTable

这是表格的外观:

预期输出:

“日期”列必须分成多列,每列代表一个月中的一天,并且应包含不同游戏和地理区域的收入总和值。

此外,必须创建一个名为“总计”的列,该列提供当月游戏广告地理的总收入。请提出一种方法来做到这一点

【问题讨论】:

在标准 SQL 中没有 split 并且使用 extract 提取日期的一部分。除此之外,我不明白你在做什么。 请同时发布您的预期输出。 如果您单击图像并查看表格,您可以看到列日期。如上所述,我正在尝试将该列拆分为多个列 您指的是 Google 的 Google Big Query 的“标准 SQL”吗? 您正在尝试“透视”您的数据,这通常是您在报告层(例如 Google Data Studio) 中而不是在 SQL 中执行的操作。也就是说,如果您明确说明所需的列数,则可以在 SQL 中进行透视;因此,要编写适用于任何给定月份的 SQL,您需要始终拥有 31 个日期列和一个总计,即使是 2 月也是如此。那是你要的吗?为什么要在 SQL 中而不是在 Data Studio 或其他报告环境中进行呢? 【参考方案1】:

要使用 BigQuery 进行所需的数据透视,您可以使用...

SELECT
  Game,
  Geo,
  Category,
  SUM(CASE WHEN EXTRACT(DAY FROM Date) = 01 THEN Revenue ELSE 0 END)   AS DAY_OF_MONTH_01,
  SUM(CASE WHEN EXTRACT(DAY FROM Date) = 02 THEN Revenue ELSE 0 END)   AS DAY_OF_MONTH_02,
  SUM(CASE WHEN EXTRACT(DAY FROM Date) = 03 THEN Revenue ELSE 0 END)   AS DAY_OF_MONTH_03,
  ...
  SUM(CASE WHEN EXTRACT(DAY FROM Date) = 30 THEN Revenue ELSE 0 END)   AS DAY_OF_MONTH_30,
  SUM(CASE WHEN EXTRACT(DAY FROM Date) = 31 THEN Revenue ELSE 0 END)   AS DAY_OF_MONTH_31,
  SUM(Revenue)                                                         AS GRAND_TOTAL
FROM
  yourSource
WHERE
      Date >= DATE '2018-08-01'
  AND Date <  DATE '2018-09-01'
GROUP BY
  Game,
  Geo,
  Category

然后列标题不包含月份,但这是因为它们不能从数据中导出。我仍然认为您应该在电子表格中进行透视,使用此查询作为源...

SELECT
  Game,
  Geo,
  Category,
  Date,
  SUM(Revenue)   AS Revenue
FROM
  yourSource
WHERE
      Date >= DATE '2018-08-01'
  AND Date <  DATE '2018-09-01'
GROUP BY
  Game,
  Geo,
  Category,
  Date

那么你不能有“巨大”的数据,你只有你需要的,然后让工作表旋转它......

【讨论】:

以上是关于如何在标准sql-大查询中将一列拆分为多列的主要内容,如果未能解决你的问题,请参考以下文章

如何在大查询中将数组转换为多列

在oracle中将一列数据拆分为多列

如何在雪花sql中将单列拆分为多列[重复]

Spark SQL一列拆分多列

如何使用 SQL 将一列拆分为多列

如何将一列拆分为多列