sql >> Database >  >> RDS >> PostgreSQL

Willekeurig veel rijen omzetten in kolommen in PostgreSQL

Het grootste probleem met draaitabellen in Postgres (en andere RDBMS) is dat de structuur (aantal en namen van kolommen) van een queryresultaat niet kan variëren afhankelijk van de geselecteerde gegevens. Een van de mogelijke oplossingen is om dynamisch een view te creëren, welke structuur wordt bepaald door de data. De voorbeeldfunctie maakt een weergave op basis van de tabel 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 $$;

Gebruik de functie nadat de tabel is gewijzigd (misschien in een trigger) en vraag de gemaakte weergave op:

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)

Test het in db<>fiddle.

Houd er rekening mee dat het alleen nodig is om een ​​weergave opnieuw te maken (de functie aan te roepen) nadat een nieuwe naam aan de tabel is toegevoegd (of een naam is verwijderd). Als de set met verschillende namen niet verandert, kunt u de weergave opvragen zonder deze opnieuw te maken. Als de set regelmatig wordt gewijzigd, is het een betere optie om een ​​tijdelijke weergave te maken.

Mogelijk bent u ook geïnteresseerd in Geaggregeerde sleutel/waarde-paren uit een JSONB-veld afvlakken?



  1. Verbind PHP met MSSQL via PDO ODBC

  2. Stel sleutel/waarde-paren in in de sessiecontext in SQL Server (sp_set_session_context)

  3. Hoe u de datum van gisteren in Oracle kunt krijgen

  4. BUITENLANDSE SLEUTEL OP DELETE RESTRICT-fout - Oracle