BigQuery 中的新 PIVOT 函数

Mur*_*rta 2 sql pivot google-bigquery

今天 BigQuery 发布了一个新的很酷的函数PIVOT

下面是它是如何工作的:

with Produce AS (
  SELECT 'Kale' as product, 51 as sales, 'Q1' as quarter UNION ALL
  SELECT 'Kale', 23, 'Q2' UNION ALL
  SELECT 'Kale', 45, 'Q3' UNION ALL
  SELECT 'Kale', 3, 'Q4' UNION ALL
  SELECT 'Apple', 77, 'Q1' UNION ALL
  SELECT 'Apple', 0, 'Q2' UNION ALL
  SELECT 'Apple', 25, 'Q3' UNION ALL
  SELECT 'Apple', 2, 'Q4')

SELECT * FROM
  (SELECT * FROM Produce)
  PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))


+---------+----+----+----+----+
| product | Q1 | Q2 | Q3 | Q4 |
+---------+----+----+----+----+
| Apple   | 77 | 0  | 25 | 2  |
| Kale    | 51 | 23 | 45 | 3  |
+---------+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)

我的问题是,在现实世界中,我们事先不知道季度值。

我尝试使用以下方法更动态地执行此操作:

SELECT * FROM
  (SELECT * FROM Produce)
  PIVOT(SUM(sales) FOR quarter in (select distinct quarter from Produce))
Run Code Online (Sandbox Code Playgroud)

没有成功。关于如何处理的任何线索?

这是reddit交叉帖子的链接

Mik*_*ant 6

在下面使用 - 它动态构建枢轴列

execute immediate (             
select '''select * from (select * from `project.dataset.Produce`)
  pivot(sum(sales) for quarter in ("''' ||  string_agg(quarter, '", "')  || '''"))
'''
from (select distinct quarter from `project.dataset.Produce` order by quarter) 
);
Run Code Online (Sandbox Code Playgroud)