【问题标题】:GBQ Transpose Table in SQLSQL中的GBQ转置表
【发布时间】:2021-09-13 02:05:29
【问题描述】:

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

起始数据

结果

【问题讨论】:

    标签: sql google-bigquery pivot transpose unpivot


    【解决方案1】:

    考虑以下方法

    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`) || '''))
    '''
    );
    

    【讨论】:

    • 感谢米哈伊尔的帮助。我了解如何做到这一点,我正在寻找一种动态地做到这一点的方法,其中列和行值可以随时间改变。我试图创建变量并执行 unpivot(Fruit 中的值(从 INFORMATION_SCHEMA.COLUMNS 中选择 column_name),但这会产生错误
    • 我明白了,没问题。将很快更新答案:o)
    • Thamk Mikhail,我在代码中遇到了一个问题,即 North、South 和 West 的后续列并非都是数字数据类型。有些是int。有没有办法将这些大量转换为数字?除了单独施法吗?
    • 我完全回答了你原来的问题。如果您认为我的陈述是真实的并且您的原始问题得到了回答,请考虑至少投票然后接受。同时,如果您有更多/后续问题 - 请发布包含所有相关详细信息的新问题,我将很乐意为您提供进一步帮助:o)
    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2020-10-08
    相关资源
    最近更新 更多