BigQuery Standrad SQL如何将行转置为列

时间:2016-07-27 08:47:50

标签: google-bigquery

我正在尝试在BigQuery中使用新的标准SQL功能。但是,我无法在文档中找到有关如何执行以下操作的参考:

我的输入是:

enter image description here

我试图将其转置为以下内容:

enter image description here

我希望像在SQL中一样使用PIVOT函数,但我无法找到如何在BigQuery Standard SQL功能中创建PIVOTs。

任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

这不是透视,它是UNION(逗号操作)

使用简单联合

select B\B1 as B, 't1' as B, t1 as value,
select B\B1 as B, 'm1' as B, m1 as value,
select B\B1 as B, 'p1' as B, p1 as value;

答案 1 :(得分:0)

请参阅下面的选项

你在YourTable中拥有的行数并不重要 - 但是列数是多少!

您需要在临时命名子查询下维护ARRAY创建,方法是使用与您必须转置的列一样多的SELECT。在下面的示例中,您的问题中有三个。

此部分无法avoid the manual work,而是通过在您选择的客户端进行编码 - 在{@ 3}}下加载表架构并在构建以下查询时循环tables.get API,然后终于运行了。
再次 - 这需要客户端编码,这看起来不像你在这里寻找

所以,我们走了:

WITH temp AS (
  SELECT B, 
    ARRAY(
      SELECT AS STRUCT 't1' AS B1, t1 AS Value UNION ALL 
      SELECT AS STRUCT 'm1' AS B1, m1 AS Value UNION ALL 
      SELECT AS STRUCT 'p1' AS B1, p1 AS Value
    ) AS bb  
  FROM YourTable 
)
SELECT B, bb.B1 AS B1, bb.Value AS Value 
FROM temp t, t.bb  

您可以使用

进行测试
WITH YourTable AS (
  SELECT 'a' AS B,  1 AS t1,  2 AS m1,  3 AS p1 UNION ALL
  SELECT 'b' AS B,  4 AS t1,  5 AS m1,  6 AS p1 UNION ALL
  SELECT 'c' AS B,  7 AS t1,  8 AS m1,  9 AS p1 UNION ALL
  SELECT 'd' AS B, 10 AS t1, 11 AS m1, 12 AS p1 UNION ALL
  SELECT 'e' AS B, 13 AS t1, 14 AS m1, 15 AS p1 UNION ALL
  SELECT 'f' AS B, 16 AS t1, 17 AS m1, 18 AS p1 
),
temp AS (
  SELECT B, 
    ARRAY(
      SELECT AS STRUCT 't1' AS B1, t1 AS Value UNION ALL 
      SELECT AS STRUCT 'm1' AS B1, m1 AS Value UNION ALL 
      SELECT AS STRUCT 'p1' AS B1, p1 AS Value
    ) AS bb
  FROM YourTable 
)
SELECT B, bb.B1 AS B1, bb.Value AS Value 
FROM temp t, t.bb