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

Dynamically creating columns from row data using Select in Bigquery

背景

我想在 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.

例如:

table 中的列...

id---c1----c2


1----x1---x2

2----x2----x3

3----x4----x5

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

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


但实际 o/p 列是::

x.id


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

以下适用于 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 很少,因此为每个 ID 手动编写几行 SUM(...) 并不是什么大问题

如果不是这种情况 - 您可以首先通过 运行ning 下面的查询

以编程方式生成上面的查询
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

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

你可以在这里看到类似的例子 -