PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengubah banyak baris menjadi kolom di PostgreSQL

Masalah utama dengan tabel pivot di Postgres (dan RDBMS lainnya) adalah bahwa struktur (jumlah dan nama kolom) dari hasil kueri tidak dapat bervariasi tergantung pada data yang dipilih. Salah satu solusi yang mungkin adalah membuat tampilan secara dinamis, yang strukturnya ditentukan oleh data. Fungsi contoh membuat tampilan berdasarkan 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 $$;

Gunakan fungsi setelah tabel diubah (mungkin dalam pemicu) dan kueri tampilan yang dibuat:

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)

Uji di db<>biola.

Perhatikan, bahwa perlu untuk membuat ulang tampilan (panggil fungsi) hanya setelah nama baru ditambahkan ke tabel (atau beberapa nama dihapus darinya). Jika kumpulan nama berbeda tidak berubah, Anda dapat membuat kueri tampilan tanpa membuatnya ulang. Jika set sering dimodifikasi, membuat tampilan sementara akan menjadi opsi yang lebih baik.

Anda mungkin juga tertarik dengan Flatten teragregasi pasangan kunci/nilai dari bidang JSONB?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan nilai default kolom tabel di Postgres?

  2. Postgres - BUAT TABEL DARI PILIH

  3. Pilih baris yang tidak terkunci di Postgresql

  4. Wildcard PostgreSQL LIKE untuk daftar kata mana pun

  5. Pertahankan UUID di PostgreSQL menggunakan JPA