Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menukar Baris secara Dinamik kepada Lajur dalam MySQL Berdasarkan Berbilang Lajur?
Penukaran Dinamik Baris kepada Lajur Berdasarkan Berbilang Lajur dalam MySQL
Dalam soalan sebelumnya, pertanyaan MySQL telah digunakan untuk menukar baris secara dinamik kepada lajur untuk satu lajur. Kini, kami menyasarkan untuk mencapai hasil yang sama untuk dua lajur: "data" dan "harga."
Masalah:
Tukar data dalam jadual berikut kepada lajur dinamakan "pesanan1," "pesanan2," "pesanan3," "item1," "item2," "item3" dan "item4" berdasarkan "pesanan" dan "item" lajur.
id | order | data | item | Price |
---|---|---|---|---|
1 | 1 | P | 1 | 50 |
1 | 1 | P | 2 | 60 |
1 | 1 | P | 3 | 70 |
1 | 2 | Q | 1 | 50 |
1 | 2 | Q | 2 | 60 |
1 | 2 | Q | 3 | 70 |
2 | 1 | P | 1 | 50 |
2 | 1 | P | 2 | 60 |
2 | 1 | P | 4 | 80 |
2 | 3 | S | 1 | 50 |
2 | 3 | S | 2 | 60 |
2 | 3 | S | 4 | 80 |
Keputusan yang Diingini:
id | order1 | order2 | order3 | item1 | item2 | item3 | item4 |
---|---|---|---|---|---|---|---|
1 | P | Q | 50 | 60 | 70 | ||
2 | P | S | 50 | 60 | 80 |
Penyelesaian:
Sementara pertanyaan berkod keras boleh digunakan jika bilangan nilai "pesanan" dan "item" diketahui, penyelesaian yang lebih dinamik diperlukan dalam case.
Nyahpaut Data:
MySQL tidak mempunyai fungsi unpivot, tetapi UNION ALL boleh digunakan untuk menukar pasangan data berbilang kepada baris:
select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA;
Menukar Nilai Kembali ke Lajur:
Data yang tidak dipangsi kemudiannya boleh ditukarkan semula menjadi lajur menggunakan fungsi agregat dengan CASE:
select id, max(case when col = 'order1' then value end) order1, max(case when col = 'order2' then value end) order2, max(case when col = 'order3' then value end) order3, max(case when col = 'item1' then value end) item1, max(case when col = 'item2' then value end) item2, max(case when col = 'item3' then value end) item3 from ( select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA ) d group by id;
Penyata Disediakan Dinamik:
Akhir sekali, pertanyaan boleh ditukar kepada pernyataan yang disediakan secara dinamik menggunakan berasaskan set penggabungan dan PELAKSANAAN:
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`) col from tableA union all select concat('item', `item`) col from tableA )d; SET @sql = CONCAT('SELECT id, ', @sql, ' from ( select id, concat(''order'', `order`) col, data value from tableA union all select id, concat(''item'', item) col, price value from tableA ) d group by id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
Pendekatan ini menyediakan cara yang fleksibel dan dinamik untuk menukar baris kepada lajur berdasarkan berbilang kriteria dalam MySQL.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Baris secara Dinamik kepada Lajur dalam MySQL Berdasarkan Berbilang Lajur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!