Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mencipta Jadual Pangsi Dinamik dengan Cekap dalam PostgreSQL Menggunakan `crosstab()`?

Bagaimanakah Saya Boleh Mencipta Jadual Pangsi Dinamik dengan Cekap dalam PostgreSQL Menggunakan `crosstab()`?

Linda Hamilton
Linda Hamiltonasal
2025-01-20 22:51:09808semak imbas

How Can I Efficiently Create Dynamic Pivot Tables in PostgreSQL Using `crosstab()`?

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:

<code class="language-sql">CREATE EXTENSION tablefunc;</code>

Penyelesaian Tab Silang Asas:

Penyelesaian

Mudah crosstab untuk senario ini:

<code class="language-sql">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);</code>

Lajur kategori sintetik:

Jika anda tidak mempunyai lajur kategori sebenar, anda boleh menggunakan fungsi tetingkap untuk mencipta lajur kategori sintetik:

<code class="language-sql">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);</code>

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:

<code class="language-sql">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);</code>

modul tablefunc:

Modul

tablefunc menyediakan pendekatan yang dipermudahkan:

<code class="language-sql">SELECT * FROM crosstab1('SELECT row_name, attrib, val::text FROM tbl ORDER BY 1,2');</code>

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn