首页 >数据库 >mysql教程 >MySQL中如何根据多列动态将行转换为列?

MySQL中如何根据多列动态将行转换为列?

Susan Sarandon
Susan Sarandon原创
2024-12-29 14:22:11776浏览

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;

这种方法提供了一种灵活且动态的方法,可以根据 MySQL 中的多个条件将行转换为列。

以上是MySQL中如何根据多列动态将行转换为列?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn