sql >> Databáze >  >> RDS >> PostgreSQL

Přeměna libovolně mnoha řádků na sloupce v PostgreSQL

Hlavním problémem kontingenčních tabulek v Postgresu (a dalších RDBMS) je to, že struktura (počet a názvy sloupců) výsledku dotazu se nemůže lišit v závislosti na vybraných datech. Jedním z možných řešení je dynamické vytvoření pohledu, jehož struktura je definována daty. Ukázková funkce vytvoří pohled na základě tabulky 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 $$;

Použijte funkci po úpravě tabulky (možná ve spouštěči) a dotazujte se na vytvořený pohled:

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)

Otestujte to v db<>fiddle.

Všimněte si, že je nutné znovu vytvořit pohled (zavolat funkci) až poté, co je do tabulky přidán nový název (nebo je z ní nějaké jméno odstraněno). Pokud se sada odlišných názvů nezmění, můžete dotazovat pohled, aniž byste jej znovu vytvořili. Pokud je sada často upravována, bylo by lepší vytvořit dočasné zobrazení.

Také by vás mohlo zajímat Sloučit agregované páry klíč/hodnota z pole JSONB?



  1. jak provést uloženou proceduru v SQL Developer?

  2. Jaký je rozdíl mezi datovou maskou 'yy' a 'rr' Oracle?

  3. Převést z data na epochu-Oracle

  4. Řetězec dotazu MySQL obsahuje