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

Dynamická transpozice pro neznámou hodnotu řádku do názvu sloupce na postgresu

Nemůžete mít "dynamický" pivot, protože číslo, názvy a datové typy všech sloupců dotazu musí být databázi známé před dotaz se skutečně provede (tj. v době analýzy).

Zjišťuji, že agregování věcí do JSON je jednodušší.

select customer_number,
       jsonb_object_agg(label, value) as props
from the_table
group by customer_number

Pokud váš frontend umí pracovat s hodnotami JSON přímo, můžete se zastavit zde.

Pokud opravdu potřebujete zobrazení s jedním sloupcem na atribut, můžete je získat z hodnoty JSON:

select customer_number, 
       props ->> 'address' as address,
       props ->> 'phone' as phone,
       props ->> 'email' as email
from (       
  select customer_number,
         jsonb_object_agg(label, value) as props
  from the_table
  group by customer_number
) t

Zdá se mi to trochu jednodušší na správu, když jsou přidány nové atributy.

Pokud potřebujete pohled se všemi štítky, můžete vytvořit uloženou proceduru a dynamicky ji vytvořit. Pokud se počet různých štítků příliš často nemění, může to být řešení:

create procedure create_customer_view() 
as
$$
declare
  l_sql text;
  l_columns text;
begin
  select string_agg(distinct format('(props ->> %L) as %I', label, label), ', ')
    into l_columns
  from the_table;
  
  l_sql := 
    'create view customer_properties as 
     select customer_number, '||l_columns||' 
     from (
      select customer_number, jsonb_object_agg(label, value) as props
       from the_table 
       group by customer_number 
     ) t';
  execute l_sql;
end;
$$
language plpgsql;

Poté vytvořte pohled pomocí:

call create_customer_view();  

A ve svém kódu stačí použít:

select *
from customer_properties;

Tuto proceduru můžete naplánovat tak, aby se spouštěla ​​v pravidelných intervalech (např. pomocí cron práce na Linuxu)



  1. Chyba intarray Postgresql:nedefinovaný symbol:pfree

  2. v rámci skupinových řazení v mysql

  3. Načítání výsledku jednoho řádku bez opakování ve smyčce z Mysql pomocí Java

  4. AKTUALIZUJTE všechny hodnoty sloupců ekvivalentní hodnotám sloupců jiných tabulek na základě jejich id