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;
這種方法提供了一種靈活且動態的方法,可以根據MySQL中的多個條件將行轉換為列。
以上是MySQL中如何根據多列動態將行轉換為列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!