sql >> Databasteknik >  >> RDS >> PostgreSQL

Omvandlar godtyckligt många rader till kolumner i PostgreSQL

Det största problemet med pivottabeller i Postgres (och andra RDBMS) är att strukturen (antal och namn på kolumner) för ett frågeresultat inte kan variera beroende på vald data. En av de möjliga lösningarna är att dynamiskt skapa en vy, vilken struktur definieras av datan. Exempelfunktionen skapar en vy baserad på tabellen 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 $$;

Använd funktionen efter att tabellen har ändrats (kanske i en trigger) och fråga den skapade vyn:

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)

Testa det i db<>fiddle.

Observera att det är nödvändigt att återskapa en vy (anropa funktionen) först efter att ett nytt namn har lagts till i tabellen (eller något namn har tagits bort från den). Om uppsättningen av distinkta namn inte ändras kan du fråga vyn utan att återskapa den. Om uppsättningen ändras ofta skulle skapa en tillfällig vy vara ett bättre alternativ.

Du kanske också är intresserad av att platta ut aggregerade nyckel/värdepar från ett JSONB-fält?



  1. Vad är databasbegränsningar?

  2. MySQL-kommandon för säkerhetskopiering och återställning för databasadministration

  3. MySQL Aggregate-funktioner utan GROUP BY-sats

  4. Hur man använder google translate URL i Oracle plsql