PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Beliebig viele Zeilen in Spalten in PostgreSQL umwandeln

Das Hauptproblem bei Pivot-Tabellen in Postgres (und anderen RDBMS) besteht darin, dass die Struktur (Anzahl und Namen der Spalten) eines Abfrageergebnisses nicht in Abhängigkeit von den ausgewählten Daten variieren kann. Eine der möglichen Lösungen besteht darin, dynamisch eine Ansicht zu erstellen, deren Struktur durch die Daten definiert wird. Die Beispielfunktion erstellt eine Ansicht basierend auf der Tabelle 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 $$;

Verwenden Sie die Funktion, nachdem die Tabelle geändert wurde (möglicherweise in einem Trigger), und fragen Sie die erstellte Ansicht ab:

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)

Testen Sie es in db<>fiddle.

Beachten Sie, dass es notwendig ist, eine Ansicht neu zu erstellen (die Funktion aufzurufen), nachdem der Tabelle ein neuer Name hinzugefügt (oder ein Name daraus entfernt) wurde. Wenn sich der Satz eindeutiger Namen nicht ändert, können Sie die Ansicht abfragen, ohne sie neu zu erstellen. Wenn das Set häufig geändert wird, wäre das Erstellen einer temporären Ansicht eine bessere Option.

Sie könnten auch an Aggregierten Schlüssel/Wert-Paaren aus einem JSONB-Feld glätten?

interessiert sein