如何在BigQuery单查询中实现两列的透视转换?
单条BigQuery查询实现目标表转换
原数据表:
| key | value | team | number |
|---|---|---|---|
| score | 35 | team | 5 |
目标数据表:
| score | team |
|---|---|
| 35 | 5 |
可以通过单条BigQuery查询实现,你尝试的连续链式PIVOT写法在BigQuery中不被支持,且逻辑存在问题,这里提供两种可行方案:
方案一:先重构数据再单次PIVOT
先将需要转换为列的字段统一整理成键值对格式,再通过一次PIVOT完成转换:
WITH a AS ( SELECT 'score' AS key, 35 AS value, 'team' AS team, 5 AS number ), unpivoted_data AS ( -- 提取score对应的value SELECT 'score' AS col_name, value AS col_value FROM a UNION ALL -- 提取team对应的number SELECT team AS col_name, number AS col_value FROM a ) SELECT * FROM unpivoted_data PIVOT (ANY_VALUE(col_value) FOR col_name IN ('score', 'team'))
方案二:使用条件聚合(更简洁)
直接通过IF结合聚合函数提取对应值,无需使用PIVOT语法:
WITH a AS ( SELECT 'score' AS key, 35 AS value, 'team' AS team, 5 AS number ) SELECT MAX(IF(key = 'score', value, NULL)) AS score, MAX(IF(team = 'team', number, NULL)) AS team FROM a
原代码问题说明
BigQuery不支持连续的PIVOT链式调用,且第一次PIVOT执行后,原表的team字段已不再是行级字段,无法作为第二次PIVOT的分组依据,导致逻辑错误。
内容的提问来源于stack exchange,提问作者Emma L
相关产品推荐
相关产品推荐

