Cara yang lebih cekap untuk melaksanakan jadual pangsi dinamik menggunakan pernyataan CASE dan GROUP BY
Berbanding dengan pertanyaan yang disediakan dalam artikel, menggunakan fungsi tablefunc
dalam sambungan crosstab()
ialah alternatif yang lebih cekap.
Pemasangan:
Mula-mula, pasang sambungan tablefunc
jika anda belum melakukannya:
CREATE EXTENSION tablefunc;
Penyelesaian Tab Silang Asas:
PenyelesaianMudah crosstab
untuk senario ini:
SELECT * FROM crosstab( 'SELECT bar, 1 AS cat, feh FROM tbl_org ORDER BY bar, feh') AS ct (bar text, val1 int, val2 int, val3 int);
Lajur kategori sintetik:
Jika anda tidak mempunyai lajur kategori sebenar, anda boleh menggunakan fungsi tetingkap untuk mencipta lajur kategori sintetik:
SELECT * FROM crosstab( $$ SELECT bar, val, feh FROM ( SELECT *, 'val' || row_number() OVER (PARTITION BY bar ORDER BY feh) AS val FROM tbl_org ) x ORDER BY 1, 2 $$ , $$VALUES ('val1'), ('val2'), ('val3')$$ ) AS ct (bar text, val1 int, val2 int, val3 int);
Tab Silang Dinamik?
Semasa mencipta crosstab
dinamik sepenuhnya menggunakan plpgsql adalah mencabar kerana pengehadan jenis pulangan dinamik. Berikut ialah contoh kes ujian yang lebih mudah:
SELECT * FROM crosstab('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2') AS ct (row_name text, val1 int, val2 int, val3 int);
modul tablefunc:
Modultablefunc
menyediakan pendekatan yang dipermudahkan:
SELECT * FROM crosstab1('SELECT row_name, attrib, val::text FROM tbl ORDER BY 1,2');
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Jadual Pangsi Dinamik dengan Cekap dalam PostgreSQL Menggunakan `crosstab()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!