CASE
dan GROUP BY
lwn. crosstab
fungsi Dalam PostgreSQL, ramai pengguna perlu menukar jadual data baris kepada jadual data lajur untuk analisis dan pelaporan. Walaupun CASE
dan GROUP BY
ialah kaedah yang biasa digunakan, alternatif yang lebih dinamik dan cekap wujud.
Sebagai contoh, pertimbangkan jadual berikut:
id | feh | bar |
---|---|---|
1 | 10 | A |
2 | 20 | A |
3 | 3 | B |
4 | 4 | B |
5 | 5 | C |
6 | 6 | D |
7 | 7 | D |
8 | 8 | D |
Output yang Diingini Tukarkan data ini kepada format berikut:
bar | val1 | val2 | val3 |
---|---|---|---|
A | 10 | 20 | NULL |
B | 3 | 4 | NULL |
C | 5 | NULL | NULL |
D | 6 | 7 | 8 |
CASE
dan GROUP BY
Satu cara untuk mencapai matlamat ini ialah menggunakan teknik CASE
dan GROUP BY
:
<code class="language-sql">SELECT bar, MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1", MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2", MAX(CASE WHEN abc."row" = 3 THEN feh ELSE NULL END) AS "val3" FROM ( SELECT bar, feh, row_number() OVER (partition by bar) as row FROM "Foo" ) abc GROUP BY bar </code>
Walaupun pendekatan ini berkesan, pendekatan ini mempunyai potensi had dari segi fleksibiliti dan prestasi.
crosstab
Fungsi: penyelesaian dinamik yang diperkenalkan oleh modul tablefunc
dalam PostgreSQL ialah alternatif yang lebih dinamik dan cekap. Menggunakan fungsi crosstab()
, anda boleh mencapai transformasi yang diingini tanpa mentakrifkan lajur output secara eksplisit. crosstab()
crosstab
adalah seperti berikut: crosstab
<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>
menyediakan data dalam format yang serasi dengan SELECT bar, 1 AS cat, feh
. Lajur crosstab()
digunakan sebagai ruang letak tiruan kerana tiada maklumat kategori dalam jadual. cat
crosstab
<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>
crosstab
. tablefunc
menyediakan alternatif yang berkuasa dan dinamik kepada kaedah crosstab()
dan CASE
. Ia membenarkan transformasi data yang fleksibel, menjadikannya alat yang berharga untuk manipulasi data dalam PostgreSQL. GROUP BY
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengubah Data Berorientasikan Baris Secara Dinamik kepada Data Berorientasikan Lajur dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!