You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:57:37