SQL 中的 GBQ 转置 Table
GBQ Transpose Table in SQL
正在尝试转置 GBQ 中的 table。该解决方案需要能够动态地处理不同的列和行。我知道有一种方法可以通过专门列出列来做到这一点,但我有不同的 tables 和大量的行。现在 GBQ 中有一个 unpivot 函数,我的想法是 Unpivot,然后 Pivot 它。不确定是否有人处理过这个问题?
起始数据
结果
考虑以下方法
select * from (
select * from data
unpivot (value for Fruit in (Apple, Bananas, Orange))
)
pivot (max(value) for `Group` in ('North', 'South', 'West'))
如果应用于您问题中的示例数据 - 输出为
以下版本构建了 unpivot 和 pivot 动态动态所需的所有引用
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`) || '''))
'''
);
正在尝试转置 GBQ 中的 table。该解决方案需要能够动态地处理不同的列和行。我知道有一种方法可以通过专门列出列来做到这一点,但我有不同的 tables 和大量的行。现在 GBQ 中有一个 unpivot 函数,我的想法是 Unpivot,然后 Pivot 它。不确定是否有人处理过这个问题?
起始数据
结果
考虑以下方法
select * from (
select * from data
unpivot (value for Fruit in (Apple, Bananas, Orange))
)
pivot (max(value) for `Group` in ('North', 'South', 'West'))
如果应用于您问题中的示例数据 - 输出为
以下版本构建了 unpivot 和 pivot 动态动态所需的所有引用
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`) || '''))
'''
);