Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengubah Baris Secara Dinamik ke Lajur dalam MySQL Berdasarkan Pelbagai Kriteria?

Bagaimana untuk Mengubah Baris Secara Dinamik ke Lajur dalam MySQL Berdasarkan Pelbagai Kriteria?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-05 12:44:42980semak imbas

How to Dynamically Pivot Rows to Columns in MySQL Based on Multiple Criteria?

Menukar Baris secara Dinamik kepada Lajur dengan Berbilang Kriteria dalam MySQL

Soalan:

Bagaimana boleh Saya secara dinamik menukar baris kepada lajur dalam MySQL berdasarkan dua kriteria, diwakili oleh dua lajur?

Konteks:

Jadual mengandungi berbilang baris dengan lajur bernama "data" dan "harga" untuk setiap baris. Matlamatnya adalah untuk mengubah jadual menjadi jadual baharu dengan lajur yang mewakili gabungan unik data dan harga, dan setiap sel mengandungi data baris yang sepadan.

Penyelesaian:

Untuk menukar baris kepada lajur secara dinamik berdasarkan berbilang kriteria, kami boleh menggunakan gabungan fungsi MySQL dan dinamik. SQL.

  1. Nyahpaut Data:

Pertama, kami menyahpaut jadual asal untuk mencipta jadual baharu dengan berbilang baris bagi setiap gabungan data yang unik dan harga.

SELECT id, CONCAT('order', `order`) AS col, data AS value
FROM tableA
UNION ALL
SELECT id, CONCAT('item', item) AS col, price AS value
FROM tableA;
  1. Pivot Data:

Seterusnya, kami mengagregatkan data yang tidak diputar kembali ke dalam lajur menggunakan pernyataan CASE.

SELECT id, 
MAX(CASE WHEN col = 'order1' THEN value END) AS order1,
MAX(CASE WHEN col = 'order2' THEN value END) AS order2,
MAX(CASE WHEN col = 'order3' THEN value END) AS order3,
MAX(CASE WHEN col = 'item1' THEN value END) AS item1,
MAX(CASE WHEN col = 'item2' THEN value END) AS item2,
MAX(CASE WHEN col = 'item3' THEN value END) AS item3
FROM (
  SELECT id, CONCAT('order', `order`) AS col, data AS value
  FROM tableA
  UNION ALL
  SELECT id, CONCAT('item', item) AS col, price AS value
  FROM tableA
) d
GROUP BY id;
  1. SQL Dinamik:

Untuk menjadikan pertanyaan dinamik, kami menggunakan pernyataan yang disediakan dan secara dinamik jana penyataan CASE berdasarkan lajur unik dalam jadual asal.

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN col = ''',
      col,
      ''' THEN value END) AS `', 
      col, '`')
  ) INTO @sql
FROM (
  SELECT CONCAT('order', `order`) AS col
  FROM tableA
  UNION ALL
  SELECT CONCAT('item', `item`) AS col
  FROM tableA
) d;

SET @sql = CONCAT('SELECT id, ', @sql, ' 
                  FROM (
                    SELECT id, CONCAT(''order'', `order`) AS col,  data AS value
                    FROM tableA
                    UNION ALL
                    SELECT id, CONCAT(''item'', item) AS col, price AS value
                    FROM tableA
                  ) d
                  GROUP BY id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Pertanyaan dinamik ini mengendalikan bilangan kriteria unik yang sewenang-wenangnya dan menghasilkan jadual berubah yang dikehendaki.

Atas ialah kandungan terperinci Bagaimana untuk Mengubah Baris Secara Dinamik ke Lajur dalam MySQL Berdasarkan Pelbagai Kriteria?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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