Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menukar Baris secara Dinamik kepada Lajur dalam MySQL Berdasarkan Berbilang Lajur?

Bagaimana untuk Menukar Baris secara Dinamik kepada Lajur dalam MySQL Berdasarkan Berbilang Lajur?

Susan Sarandon
Susan Sarandonasal
2024-12-29 14:22:11770semak imbas

How to Dynamically Convert Rows to Columns in MySQL Based on Multiple Columns?

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!

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