Gunakan CASE dan GROUP BY untuk menggantikan PIVOT secara dinamik
Soalan:
Data yang ditunjukkan dalam jadual di bawah disusun dalam baris dan lajur. Matlamatnya adalah untuk menukar ini kepada jadual dengan bilangan lajur yang dinamik, di mana setiap lajur mewakili nilai yang dikumpulkan mengikut kategori tertentu.
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 |
Keluaran yang dijangkakan:
bar | val1 | val2 | val3 |
---|---|---|---|
A | 10 | 20 | |
B | 3 | 4 | |
C | 5 | ||
D | 6 | 7 | 8 |
Pertanyaan asal:
Pertanyaan berikut menggunakan ungkapan CASE dan GROUP BY untuk mencapai hasil yang diingini:
<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>
Alternatif tab silang yang cekap:
Untuk meningkatkan kecekapan dan kebolehbacaan, anda boleh menggunakan fungsi tab silang dalam modul tablefunc untuk melaksanakan penyelesaian dinamik. Berikut ialah contoh:
<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>
Mengendalikan berbilang nilai:
Untuk senario di mana terdapat berbilang nilai di bawah kategori yang sama, fungsi tab silang boleh dilanjutkan kepada bentuk berikut:
<code class="language-sql">SELECT * FROM crosstab( 'SELECT bar, val, feh FROM tbl_org ORDER BY 1, 2') AS ct (bar text, val1 int, val2 int, val3 int); -- 更多列?</code>
Fungsi tab silang terbina dalam:
Modul tablefunc juga menyediakan fungsi tab silang yang dipratentukan untuk bilangan lajur tertentu:
<code class="language-sql">SELECT * FROM crosstab3('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2');</code>
Fungsi ini menjadikan panggilan lebih mudah dan mengendalikan data teks secara lalai.
Jenis pulangan dinamik:
Walaupun tablefunc memudahkan proses, ia mempunyai had dalam mengendalikan jenis pulangan dinamik. Untuk menyelesaikan masalah ini, kaedah lain boleh dipertimbangkan, seperti menggunakan fungsi PL/pgSQL atau mencipta pernyataan SQL dinamik.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pertanyaan Crosstab dengan Cekap dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!