sql >> Base de Datos >  >> RDS >> PostgreSQL

Convertir arbitrariamente muchas filas en columnas en PostgreSQL

El principal problema con las tablas dinámicas en Postgres (y otros RDBMS) es que la estructura (número y nombres de las columnas) del resultado de una consulta no puede variar según los datos seleccionados. Una de las posibles soluciones es crear dinámicamente una vista, cuya estructura está definida por los datos. La función de ejemplo crea una vista basada en la tabla 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 $$;

Use la función después de modificar la tabla (tal vez en un disparador) y consulte la vista creada:

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)

Pruébelo en db<>fiddle.

Tenga en cuenta que es necesario volver a crear una vista (llamar a la función) solo después de que se agregue un nuevo nombre a la tabla (o se elimine algún nombre de ella). Si el conjunto de nombres distintos no cambia, puede consultar la vista sin volver a crearla. Si el conjunto se modifica con frecuencia, crear una vista temporal sería una mejor opción.

También puede estar interesado en Aplanar pares clave/valor agregados de un campo JSONB.