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

如何根据多个条件动态地将 MySQL 中的行转换为列?

Mary-Kate Olsen
发布: 2025-01-05 12:44:42
原创
1013 人浏览过

How to Dynamically Pivot Rows to Columns in MySQL Based on Multiple Criteria?

在 MySQL 中动态地将行转换为具有多个条件的列

问题:

如何我根据两个条件动态地将 MySQL 中的行转换为列,由两个表示列?

上下文:

表包含多行,每行包含名为“数据”和“价格”的列。目标是将表格转换为新表格,其中的列代表数据和价格的唯一组合,每个单元格包含相应的行数据。

解决方案:

为了根据多个条件动态地将行转换为列,我们可以结合使用 MySQL 函数和动态SQL.

  1. 逆透视数据:

首先,我们逆透视原始表,为每个唯一的数据组合创建一个包含多行的新表和价格。

SELECT id, CONCAT('order', `order`) AS col, data AS value
FROM tableA
UNION ALL
SELECT id, CONCAT('item', item) AS col, price AS value
FROM tableA;
登录后复制
  1. 枢轴数据:

接下来,我们使用 CASE 语句将未透视的数据聚合回列中。

SELECT id, 
MAX(CASE WHEN col = 'order1' THEN value END) AS order1,
MAX(CASE WHEN col = 'order2' THEN value END) AS order2,
MAX(CASE WHEN col = 'order3' THEN value END) AS order3,
MAX(CASE WHEN col = 'item1' THEN value END) AS item1,
MAX(CASE WHEN col = 'item2' THEN value END) AS item2,
MAX(CASE WHEN col = 'item3' THEN value END) AS item3
FROM (
  SELECT id, CONCAT('order', `order`) AS col, data AS value
  FROM tableA
  UNION ALL
  SELECT id, CONCAT('item', item) AS col, price AS value
  FROM tableA
) d
GROUP BY id;
登录后复制
  1. 动态 SQL:

为了使查询动态化,我们使用准备好的语句并动态生成基于原始表中唯一列的 CASE 语句。

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`) AS col
  FROM tableA
  UNION ALL
  SELECT CONCAT('item', `item`) AS col
  FROM tableA
) d;

SET @sql = CONCAT('SELECT id, ', @sql, ' 
                  FROM (
                    SELECT id, CONCAT(''order'', `order`) AS col,  data AS value
                    FROM tableA
                    UNION ALL
                    SELECT id, CONCAT(''item'', item) AS col, price AS value
                    FROM tableA
                  ) d
                  GROUP BY id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
登录后复制

此动态查询处理任意数量的唯一条件并生成所需的转换表。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板