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
Lepaskan: 2025-01-05 12:44:42
asal
979 orang telah melayarinya

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

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!

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