一尘不染

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

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列是:

编号


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


阅读 246

收藏
2021-03-10

共1个答案

一尘不染

以下是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(…)的行就没什么大不了的

如果不是这种情况,您可以先通过运行下面的查询来以编程方式生成上面的查询

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

因此,现在只需将其复制并粘贴到查询编辑器中并运行即可

2021-03-10