首页 >数据库 >mysql教程 >如何使用单列中的动态列名在 MySQL 中透视数据?

如何使用单列中的动态列名在 MySQL 中透视数据?

Linda Hamilton
Linda Hamilton原创
2025-01-13 19:57:44228浏览

How to Pivot Data in MySQL with Dynamic Column Names from a Single Column?

MySQL动态行值作为列名的数据透视

问题:

在旧版MySQL表中,您的数据具有作为名为“name”的单个列中唯一值存储的可变列名。您需要一个查询,将此数据转换为透视格式,其中名称值成为列标题,相应的字段值成为这些标题下的值。

解决方案:

尽管缺乏对透视的原生支持,MySQL 仍然可以通过动态SQL和GROUP_CONCAT()函数实现这一点。

MySQL查询:

<code class="language-sql">SELECT CONCAT(
  'SELECT `table`.id', GROUP_CONCAT('
     ,    `t_', REPLACE(name, '`', '``'), '`.value
         AS `', REPLACE(name, '`', '``'), '`'
     SEPARATOR ''),
 ' FROM `table` ', GROUP_CONCAT('
     LEFT JOIN `table`   AS `t_', REPLACE(name, '`', '``'), '`
            ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
           AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
     SEPARATOR ''),
 ' GROUP BY `table`.id'
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;

PREPARE stmt FROM @qry;
EXECUTE stmt;</code>

说明:

  1. 子查询选择不同的名称值,生成一个UNION查询来表示透视所需的不同的列名。
  2. CONCAT()函数连接SQL字符串,使用GROUP_CONCAT动态地将列名与其值连接起来。
  3. 它使用生成的SQL字符串创建一个临时存储过程stmt。
  4. EXECUTE stmt语句执行动态SQL查询,按预期方式透视数据。

结果:

查询返回一个透视结果集,其中名称值作为列标题,字段值作为相应的值:

id timezone language country something
0 Europe/London en 45 x
1 Europe/Paris fr 46 NULL

以上是如何使用单列中的动态列名在 MySQL 中透视数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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