Apakah ada yang tahu cara membuat kueri tab silang di PostgreSQL?
Misalnya saya punya tabel berikut:
Section Status Count
A Active 1
A Inactive 2
B Active 4
B Inactive 5
Saya ingin kueri mengembalikan tab silang berikut:
Section Active Inactive
A 1 2
B 4 5
Apakah ini mungkin?
Jawaban:
Instal modul tambahan
tablefunc
satu kali per basis data, yang menyediakan fungsicrosstab()
. Sejak Postgres 9.1 Anda dapat menggunakannyaCREATE EXTENSION
untuk itu:Kasing uji yang ditingkatkan
Bentuk sederhana - tidak cocok untuk atribut yang hilang
crosstab(text)
dengan 1 parameter input:Pengembalian:
C
: nilai7
diisi untuk kolom pertama. Kadang-kadang, perilaku ini diinginkan, tetapi tidak untuk kasus penggunaan ini.Bentuk yang aman
crosstab(text, text)
dengan 2 parameter input:Pengembalian:
Catat hasil yang benar untuk
C
.The Parameter kedua dapat permintaan apapun yang kembali satu baris per atribut yang cocok dengan urutan definisi kolom di akhir. Seringkali Anda ingin meminta atribut berbeda dari tabel yang mendasarinya seperti ini:
Itu ada di manual.
Karena Anda harus mengeja semua kolom dalam daftar definisi kolom (kecuali untuk varian yang telah ditentukan ), biasanya lebih efisien untuk memberikan daftar pendek dalam ekspresi seperti yang ditunjukkan:
crosstabN()
VALUES
Atau (tidak ada dalam manual):
Saya menggunakan kutipan dolar untuk membuat kutipan lebih mudah.
Anda bahkan dapat menampilkan kolom dengan tipe data berbeda dengan
crosstab(text, text)
- selama representasi teks dari kolom nilai adalah input yang valid untuk tipe target. Dengan cara ini Anda mungkin memiliki atribut yang berbeda dan outputtext
,date
,numeric
dll untuk atribut masing-masing. Ada contoh kode di akhir babcrosstab(text, text)
dalam manual .db <> biola di sini
Contoh lanjutan
Pivot pada Banyak Kolom menggunakan Tablefunc - juga menunjukkan "kolom ekstra" yang disebutkan
Alternatif dinamis untuk pivot dengan CASE dan GROUP BY
\crosstabview
dalam psqlPostgres 9.6 menambahkan meta-command ini ke psql terminal interaktif default . Anda dapat menjalankan kueri yang akan Anda gunakan sebagai
crosstab()
parameter pertama dan mengumpankannya\crosstabview
(segera atau pada langkah berikutnya). Suka:Hasil yang sama seperti di atas, tetapi ini adalah fitur representasi di sisi klien secara eksklusif. Baris input diperlakukan sedikit berbeda, oleh karena
ORDER BY
itu tidak diperlukan. Detail untuk\crosstabview
dalam manual. Ada lebih banyak contoh kode di bagian bawah halaman itu.Jawaban terkait pada dba.SE oleh Daniel Vérité (penulis fitur psql):
The jawaban yang diterima sebelumnya sudah usang.
Varian fungsi
crosstab(text, integer)
sudah usang.integer
Parameter kedua diabaikan. Saya mengutip manual saat ini :Pengecoran dan penggantian nama yang tidak perlu.
Gagal jika satu baris tidak memiliki semua atribut. Lihat varian aman dengan dua parameter input di atas untuk menangani atribut yang hilang dengan benar.
ORDER BY
diperlukan dalam bentuk satu-parameter daricrosstab()
. Manual:sumber
In practice the SQL query should always specify ORDER BY 1,2 to ensure that the input rows are properly ordered
Anda dapat menggunakan
crosstab()
fungsi tablefunc modul tambahan - yang harus Anda instal satu kali per basis data. Sejak PostgreSQL 9.1 Anda dapat menggunakannyaCREATE EXTENSION
untuk itu:Dalam kasus Anda, saya percaya akan terlihat seperti ini:
sumber
sumber
sum()
, akan lebih baik untuk menggunakanmin()
ataumax()
tidak adaELSE
yang berfungsitext
juga. Tetapi ini memiliki efek yang sedikit berbeda daripadacorosstab()
, yang hanya menggunakan nilai "pertama" per atribut. Tidak masalah asalkan hanya ada satu. Akhirnya, kinerja juga relevan.crosstab()
ditulis dalam C dan dioptimalkan untuk tugas tersebut.ERROR: 42803: aggregate function calls may not be nested
Solusi dengan agregasi JSON:
sumber
Maaf ini tidak lengkap karena saya tidak bisa mengujinya di sini, tetapi mungkin membuat Anda pergi ke arah yang benar. Saya menerjemahkan dari sesuatu yang saya gunakan yang membuat pertanyaan serupa:
Kode tempat saya bekerja adalah:
yang akan mengembalikan typeID, tawaran harga tertinggi dan harga terendah yang diminta dan perbedaan di antara keduanya (perbedaan positif berarti sesuatu dapat dibeli dengan harga lebih murah daripada yang bisa dijual).
sumber
Crosstab
fungsi tersedia di bawahtablefunc
ekstensi. Anda harus membuat ekstensi ini satu kali untuk basis data.BUAT EKSTENSI
tablefunc
;Anda dapat menggunakan kode di bawah ini untuk membuat tabel pivot menggunakan tab silang:
sumber