Rumah > pangkalan data > tutorial mysql > Bagaimanakah saya boleh menukar data secara dinamik dalam MySQL tanpa fungsi PIVOT asli?

Bagaimanakah saya boleh menukar data secara dinamik dalam MySQL tanpa fungsi PIVOT asli?

Patricia Arquette
Lepaskan: 2025-01-06 07:24:39
asal
908 orang telah melayarinya

How can I dynamically pivot data in MySQL without a native PIVOT function?

PIVOTING Dinamik dalam MySQL

Dalam pangkalan data hubungan kami, kami mempunyai jadual bernama "Bahagian" yang menyimpan maklumat tentang bahagian produk, termasuk bahagiannya ID bahagian, jenis bahagian dan ID produk yang berkaitan. Struktur jadual menyerupai yang berikut:

Parts
--------------------------------------
part_id | part_type | product_id
--------------------------------------
1        | A        | 1
2        | B        | 1
3        | A        | 2
4        | B        | 2
5        | A        | 3
6        | B        | 3
Salin selepas log masuk

Objektif:

Matlamat kami adalah untuk membina pertanyaan yang mengubah data ini menjadi format terpivot, menghasilkan jadual dengan satu baris untuk setiap ID produk unik, bersama-sama dengan lajur yang mewakili ID bahagian yang sepadan untuk jenis "A" dan "B". Jadual output yang diingini sepatutnya kelihatan seperti ini:

Product_ID | Part_A_ID | Part _B_ID
----------------------------------------
1           | 1         | 2
2           | 3         | 4
3           | 5         | 6
Salin selepas log masuk

Penyelesaian:

Malangnya, MySQL tidak mempunyai fungsi PIVOT asli. Walau bagaimanapun, kita boleh mensimulasikan kelakuannya menggunakan gabungan fungsi agregat dan penyataan CASE. Untuk mencipta versi dinamik yang mengendalikan berbilang jenis bahagian, kami menggunakan pernyataan yang disediakan:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when part_type = ''',
      part_type,
      ''' then part_id end) AS part_',
      part_type, '_id'
    )
  ) INTO @sql
FROM
  parts;
SET @sql = CONCAT('SELECT product_id, ', @sql, ' 
                  FROM parts 
                   GROUP BY product_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Salin selepas log masuk

Pertanyaan ini membina pernyataan SQL secara dinamik berdasarkan jenis bahagian unik dalam jadual 'Bahagian'. Ia kemudian menggunakan pernyataan yang disediakan untuk melaksanakan pernyataan SQL yang dijana, dengan cekap mengendalikan potensi isu prestasi dengan set hasil yang besar.

Alternatif untuk Penyelesaian Statik dengan Bilangan Lajur Terhad:

Jika kami mempunyai bilangan jenis bahagian yang terhad, kami boleh menggunakan versi statik pertanyaan:

select product_id,
  max(case when part_type ='A' then part_id end) as Part_A_Id,
  max(case when part_type ='B' then part_id end) as Part_B_Id
from parts
group by product_id
Salin selepas log masuk

Ini alternatif disyorkan apabila bilangan jenis bahagian tetap dan kecil.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menukar data secara dinamik dalam MySQL tanpa fungsi PIVOT asli?. 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