Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Melaksanakan Pertanyaan Crosstab dengan Cekap dalam SQL?

Bagaimana untuk Melaksanakan Pertanyaan Crosstab dengan Cekap dalam SQL?

Patricia Arquette
Lepaskan: 2025-01-20 22:23:11
asal
403 orang telah melayarinya

How to Efficiently Perform a Crosstab Query in SQL?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan