Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mengubah Data Secara Dinamik dalam MySQL Menggunakan Fungsi Agregat dan Pernyataan CASE?

Bagaimana untuk Mengubah Data Secara Dinamik dalam MySQL Menggunakan Fungsi Agregat dan Pernyataan CASE?

Mary-Kate Olsen
Lepaskan: 2025-01-06 07:56:43
asal
596 orang telah melayarinya

How to Dynamically Pivot Data in MySQL Using Aggregate Functions and CASE Statements?

Mengasingkan Data Secara Dinamik dengan Fungsi Agregat MySQL dan Penyata KES

Pertimbangkan jadual bahagian produk dengan skema berikut:

CREATE TABLE Parts (
    part_id INT NOT NULL,
    part_type CHAR(1) NOT NULL,
    product_id INT NOT NULL,
    PRIMARY KEY (part_id)
);
Salin selepas log masuk

Sampel Data:

INSERT INTO Parts (part_id, part_type, product_id) VALUES
(1, 'A', 1),
(2, 'B', 1),
(3, 'A', 2),
(4, 'B', 2),
(5, 'A', 3),
(6, 'B', 3);
Salin selepas log masuk

Matlamatnya adalah untuk memutar data ini ke dalam jadual yang mewakili bahagian produk sebagai lajur:

CREATE TABLE PivotedParts (
    product_id INT NOT NULL,
    part_A_id INT,
    part_B_id INT,
    PRIMARY KEY (product_id)
);
Salin selepas log masuk

Penyelesaian Pangsi Dinamik:

MySQL tidak mempunyai fungsi PIVOT terbina dalam, tetapi penyelesaian dinamik boleh dicapai menggunakan fungsi agregat dan penyataan KES:

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

Contoh Output:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
Salin selepas log masuk
Salin selepas log masuk

Penyelesaian Pivoting Statik (untuk bilangan lajur yang terhad):

Untuk penyelesaian pivoting statik dengan bilangan lajur yang terhad, pertanyaan berikut boleh digunakan:

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

Output:

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
Salin selepas log masuk
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengubah Data Secara Dinamik dalam MySQL Menggunakan Fungsi Agregat dan Pernyataan CASE?. 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