使用Bigquery中的Select在动态创建行数据中的列

时间:2016-09-08 14:52:55

标签: mysql sql google-bigquery dynamic-sql

背景

我想动态地在sql select语句中重命名我的case语句。

例如:

SELECT (case when id= x.id then x.sums end) x.id as (select id,count(*) sums from table group by id) x

我想要的输出是创建的列列表,标签为“id”列中的不同ID。

但是,此变量 x.id 不会动态输出值,而是输出单列x.id。

例如:

表格中的列...

ID --- ---- C1 C2

1 ---- --- X1 X2

2 ---- ---- X2 X3

3 ---- ---- X4 X5

运行查询后预期的列...

1 ----- 2 ---- 3

但实际的o / p列是::

x.id

查询 任何想法,如何使用选择查询动态生成列,请纠正我,如果我错了。

1 个答案:

答案 0 :(得分:2)

以下是BigQuery!

请注意:您对输出列名称的期望不正确!
列名不能以数字开头 - 所以在下面的示例中 - 我将使用id_1,id_2和id_3而不是1,2和3

SELECT
  SUM(CASE WHEN id = 1 THEN 1 END) AS id_1,
  SUM(CASE WHEN id = 2 THEN 1 END) AS id_2,
  SUM(CASE WHEN id = 3 THEN 1 END) AS id_3
FROM YourTable

上面的示例假设您事先知道了您的ID并且它们很少,因此为每个id手动编写少量具有SUM(...)的行并不是什么大问题

如果不是这种情况 - 您可以先运行以下查询

,以编程方式生成上述查询
SELECT 'SELECT ' + 
   GROUP_CONCAT_UNQUOTED(
      'SUM(CASE WHEN id = ' + STRING(id) + ' THEN 1 END) AS id_' + STRING(id)
   ) 
   + ' FROM YourTable'
FROM (
  SELECT id FROM (
    SELECT * FROM YourTable GROUP BY id ORDER BY id
)

结果 - 你会得到如下的字符串

SELECT SUM(CASE WHEN id = 1 THEN 1 END) AS id_1,SUM(CASE WHEN id = 2 THEN 1 END) AS id_2,SUM(CASE WHEN id = 3 THEN 1 END) AS id_3 FROM YourTable

所以,现在只需将其复制并粘贴到查询编辑器中并运行它

你可以在这里看到类似的例子 - https://stackoverflow.com/a/36623258/5221944