您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在PostgreSQL中将任意多的行转换为列

在PostgreSQL中将任意多的行转换为列

Postgres中数据透视表的主要问题是查询的结果结构(列的数量名称)不能随所选数据而变化。一种可能的解决方案是动态创建视图,该视图由数据定义。示例函数基于表创建一个视图example_table

create or replace function create_pivot_view()
returns void language plpgsql as $$
declare
    list text;
begin
    select string_agg(format('jdata->>%1$L "%1$s"', name), ', ')
    from (
        select distinct name
        from example_table
        ) sub
    into list;

    execute format($f$
        drop view if exists example_pivot_view;
        create view example_pivot_view as
        select lbl, %s
        from (
            select lbl, json_object_agg(name, value) jdata
            from example_table
            group by 1
            order by 1
            ) sub
        $f$, list);
end $$;

修改表后(可能在触发器中)使用该函数查询创建的视图:

select create_pivot_view();

select *
from example_pivot_view;

 lbl | num | colour | percentage 
-----+-----+--------+------------
   1 | 1   | Red    | 25.0
   2 | 2   | Green  | 50.0
   3 | 3   | Blue   | 75.0
(3 rows)

在这里测试。

请注意,只有在将新名称添加到表中(或从中删除了一些名称)之后,才需要重新创建视图(调用函数)。如果唯一名称集不变,则可以查询视图而无需重新创建。如果对集合进行频繁修改,则创建一个临时视图将是一个更好的选择。

您可能还对JSONB字段中的扁平化聚合键/值对感兴趣?

SQLServer 2022/1/1 18:37:12 有593人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶