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.
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;
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;
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!