首页 > 解决方案 > SQL中的GBQ转置表

问题描述

试图在 GBQ 中转置一个表。该解决方案需要能够动态地处理不同的列和行。我知道有一种方法可以通过专门列出列来做到这一点,但是我有不同的表,其中包含大量的行。GBQ 现在有一个 unpivot 功能,我的想法是 Unpivot,然后 Pivot 它。不确定是否有人处理过这个问题?

起始数据

结果

在此处输入图像描述

标签: sqlgoogle-bigquerypivottransposeunpivot

解决方案


考虑以下方法

select * from (
  select * from data
  unpivot (value for Fruit in (Apple, Bananas, Orange))
)
pivot (max(value) for `Group` in ('North', 'South', 'West'))         

如果应用于您问题中的样本数据 - 输出是

在此处输入图像描述

下面的版本构建了 unpivot 和动态旋转所需的所有参考

execute immediate (select '''select * from (
  select * from `project.dataset.table`
  unpivot (value for Fruit in (''' || (select array_to_string(regexp_extract_all(to_json_string((select as struct * except(`Group`) from unnest([t]))), r'"([^"]+)":'), ', ')
from `project.dataset.table` t limit 1) || ''')) 
)
pivot (max(value) for `Group` in (''' || (select '"' || string_agg(distinct `Group`, '", "' order by `Group`) || '"' from `project.dataset.table`) || '''))
'''
);

推荐阅读