在BigQuery SQL中如何实现表格的部分转置(列转行)?
在BigQuery中实现宽表转长表的SQL方案
你要实现的是宽表转长表(逆透视/Unpivot)操作,BigQuery里有两种简单直接的方式可以完成:
方式一:用ARRAY+UNNEST手动构造行
这种方式适合列数较少的场景,灵活性高,能自定义更多逻辑:
SELECT project_name, item.type, item.money FROM `your-project.your-dataset.your-table`, UNNEST([ STRUCT('revenues' AS type, revenues AS money), STRUCT('costs' AS type, costs AS money), STRUCT('margin' AS type, margin AS money) ]) AS item ORDER BY project_name, type;
原理是把每一行的revenues、costs、margin三个列,打包成一个包含结构体的数组,再通过UNNEST把数组拆成单独的行,自动对应project_name。
方式二:用BigQuery原生UNPIVOT语法
如果使用的是BigQuery 2.0及以上版本,可以用官方原生的UNPIVOT语法,代码更简洁易读:
SELECT project_name, type, money FROM `your-project.your-dataset.your-table` UNPIVOT ( money FOR type IN (revenues, costs, margin) ) ORDER BY project_name, type;
这里UNPIVOT的逻辑很直白:指定money作为值列,type作为类型列,然后列出需要转成行的原列名(revenues、costs、margin),BigQuery会自动完成转置。
两种方式对比
- 原生
UNPIVOT语法更简洁,代码可读性高,适合常规的逆透视需求; ARRAY+UNNEST的方式更灵活,比如可以在构造结构体时添加过滤条件、转换逻辑,或者动态生成列(结合INFORMATION_SCHEMA)。
内容的提问来源于stack exchange,提问作者Giacomo F
相关产品推荐
相关产品推荐

