Kueri tab silang dasar untuk contoh Anda sederhana:
SELECT * FROM crosstab(
'SELECT zoom, day, point
FROM province
ORDER BY 1, 2'
, $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);
Tapi tidak dengan nama kolom dinamis atau jumlah kolom dinamis. Sebagai kompromi, Anda dapat memiliki jumlah kolom yang tetap dan hanya mengisi kolom yang terkemuka. Dasar-dasar:
- Kueri Tab Silang PostgreSQL
Dinamis?
crosstab_hash
tidak akan membantu Anda dengan nama kolom dinamis. Ini untuk penggunaan berulang tanpa mengetikkan daftar definisi kolom, tetapi tidak untuk dinamis nama kolom. Contoh:
- Menghasilkan kolom secara dinamis untuk tab silang di PostgreSQL
- Sql:Mengubah baris menjadi kolom
Untuk nama kolom yang benar-benar dinamis, Anda memerlukan dua perjalanan pulang pergi ke server. Apakah Anda mengambil nama kolom dengan kueri pertama untuk membuat kueri kedua, atau Anda membuat kursor atau tabel sementara atau pernyataan yang disiapkan. Apa pun yang Anda coba, Anda memerlukan dua perjalanan pulang pergi. SQL ingin mengetahui tipe pengembalian pada waktu panggilan.
Yang paling dekat dengan panggilan "dinamis" adalah dengan crosstab_n()
khusus saya fungsi yang didefinisikan dalam jawaban terkait ini:
- Alternatif dinamis untuk pivot dengan CASE dan GROUP BY
Atau Anda melepaskan ide kueri tab silang yang sepenuhnya dinamis (karena, Anda tahu, itu tidak mungkin) dan menggunakan alur kerja dua langkah, seperti yang disebutkan di atas.
-
Biarkan fungsi menghasilkan teks kueri tab silang. Anda dapat menggunakan fungsi yang disediakan di sini (dan menyesuaikannya dengan kebutuhan Anda!):
- Jalankan kueri tab silang dinamis
Khususnya, hapus
GROUP BY 1, 2
, karena Anda tidak menggabungkan baris sebelum tabulasi silang. -
Jalankan fungsi yang dihasilkan.
Untuk kelengkapannya juga ada \crosstabview
baru metacommand di psql di Postgres 9.6 (baru saja dirilis) - dengan fungsi serupa, dan dapat menampilkan nama kolom dinamis (melampirkan nama dinamis terjadi di klien psql, bukan di server Postgres).