GoogleSQL/标准SQL实现行转列(Pivot)方法咨询
在Google SQL/标准SQL中实现行转列(Pivot)的方法
我来帮你搞定这个行转列的需求!先明确下你的数据和期望效果:
原始输入数据
ID name timeSpent_in_mins 1 ABC 12 1 XYZ 24
期望输出结果
ID ABC XYZ 1 12 24
在Google SQL(也就是标准SQL)里,有两种常用的方法实现这个效果,下面给你详细拆解:
方法一:CASE WHEN + 聚合函数(通用写法)
这是最普适的方案,几乎所有SQL方言都支持,适合你已经明确要转成列的name值的场景。核心思路是针对每个目标列,用CASE语句筛选出对应的数据,再通过聚合函数提取有效值。
SELECT ID, -- 匹配name为ABC的记录,取出对应的时长,否则返回NULL MAX(CASE WHEN name = 'ABC' THEN timeSpent_in_mins END) AS ABC, -- 同理处理XYZ MAX(CASE WHEN name = 'XYZ' THEN timeSpent_in_mins END) AS XYZ FROM your_table_name -- 替换成你的实际表名 GROUP BY ID;
为什么用MAX?因为当name不匹配时CASE会返回NULL,聚合函数会自动忽略NULL值,正好能精准取出每个ID对应name的时长。如果你的数据里同一个ID+name有多条记录,可以根据业务需求换成SUM(总时长)或者AVG(平均时长)这类聚合函数。
方法二:使用标准SQL的PIVOT语法(简洁写法)
Google SQL支持标准SQL的PIVOT操作,写法更简洁直观,同样适合已知目标列的场景:
SELECT * FROM ( -- 先筛选出需要用到的字段 SELECT ID, name, timeSpent_in_mins FROM your_table_name -- 替换成实际表名 ) AS source_data PIVOT ( -- 指定聚合函数,这里用MAX处理单条记录的情况 MAX(timeSpent_in_mins) -- 指定要转成列的字段是name FOR name IN ('ABC' AS ABC, 'XYZ' AS XYZ) ) AS pivoted_table;
这里的子查询用来准备原始数据,PIVOT块里定义了三个关键部分:聚合函数、要转列的字段、具体要转的列值(还可以给列起别名,比如如果想把ABC改成Time_ABC,直接写'ABC' AS Time_ABC就行)。
补充说明
如果你的name值是动态变化的(比如不确定有哪些值),静态的PIVOT就没法直接用了。这时候可以在Google BigQuery里用EXECUTE IMMEDIATE结合动态SQL生成查询语句,但如果是固定列的场景,上面两种方法完全够用。
内容的提问来源于stack exchange,提问作者synccm2012
相关产品推荐
相关产品推荐

