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?