大查询转置

时间:2016-04-14 07:21:06

标签: mysql google-bigquery

我有一个包含以下列的Google Big Query表:

date  | user | group | value
----------------------------
date1 | user1 | group1 | 10
----------------------------
date1 | user2 | group1 | 5
----------------------------
date2 | user1 | group1 | 20
----------------------------
date2 | user2 | group1 | 10
---------------------------
etc...

现在我想将此转换为:

group  | date1 | date2
----------------------
group1 | 15    | 30

所以我想拥有每组每天的价值总和。我写了一个看起来像这样的查询:

SELECT date, group, value FROM [table] GROUP BY date, group, value

但是我该如何转置它以使每个列都是一个日期,每一行是该值的总计的集合?

1 个答案:

答案 0 :(得分:2)

目前还没有很好的方法在BigQuery中执行此操作,但您可以按照以下想法执行此操作

第1步

运行以下查询

SELECT 'SELECT [group], ' + 
   GROUP_CONCAT_UNQUOTED(
      'SUM(IF([date] = "' + [date] + '", value, NULL)) as [d_' + REPLACE([date], '/', '_') + ']'
   ) 
   + ' FROM YourTable GROUP BY [group] ORDER BY [group]'
FROM (
  SELECT [date] FROM YourTable GROUP BY [date] ORDER BY [date]
)

结果 - 你会得到如下的字符串(为了便于阅读,它的格式如下)

SELECT 
    [group], 
    SUM(IF([date] = "date1", value, NULL)) AS [d_date1],
    SUM(IF([date] = "date2", value, NULL)) AS [d_date2] 
FROM YourTable 
GROUP BY [group] 
ORDER BY [group]   

第2步

只需运行上面的撰写查询

结果如下所示

group   d_date1 d_date2  
group1  15      30      

注1 :如果你有很多小组需要进行调整,那么步骤1会很有帮助。在这种情况下 - 步骤1可帮助您生成查询

注2 :这些步骤可以在您选择的任何客户端轻松实现,也可以在BigQuery Web UI中运行这些步骤

您可以在我的其他帖子中看到有关旋转的更多信息。

How to scale Pivoting in BigQuery?
请注意 - 每张桌子有10K列的限制 - 所以你受限于10K组织 您还可以在下面看到简化示例(如果上面的一个太复杂/冗长):
How to transpose rows to columns with large amount of the data in BigQuery/SQL?
How to create dummy variable columns for thousands of categories in Google BigQuery?
Pivot Repeated fields in BigQuery