首頁 >資料庫 >mysql教程 >MySQL中如何根據多列動態將行轉換為列?

MySQL中如何根據多列動態將行轉換為列?

Susan Sarandon
Susan Sarandon原創
2024-12-29 14:22:11763瀏覽

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

MySQL 中基於多列的行到列的動態轉換

在上一個問題中,使用了MySQL 查詢來動態轉換行到單一列的列。現在,我們的目標是對兩列「資料」和「價格」實現相同的結果。

問題:

將下表中的資料轉換為列基於“order”命名為“order1”、“order2”、“order3”、“item1” 、「item2」、「item3」和「item4」和「item」欄位。

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

期望結果:

id order1 order2 order3 item1 item2 item3 item4
1 P Q 50 60 70
2 P S 50 60 80

解決方案:

雖然很難如果「訂單」和「商品」值的數量已知,則可以使用編碼查詢,這是一種更動態的查詢一般情況下需要解決方案。

逆透視資料:

MySQL 缺少逆透視功能,但可以使用 UNION ALL將多個資料對轉換為rows:

select id, concat('order', `order`) col,  data value
from tableA
union all
select id, concat('item', item) col, price value
from tableA;

將值轉換回列:

然後可以使用帶有 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;

動態準備語句:

最後,可以使用基於集合的串聯將查詢轉換為動態準備語句EXECUTE:

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;

這種方法提供了一種靈活且動態的方法,可以根據My​​SQL中的多個條件將行轉換為列。

以上是MySQL中如何根據多列動態將行轉換為列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn