首页 > 数据库 > mysql教程 > 如何使用动态生成的用户定义列名转置 SQL 表数据?

如何使用动态生成的用户定义列名转置 SQL 表数据?

DDD
发布: 2025-01-05 21:40:41
原创
594 人浏览过

How Can I Transpose SQL Table Data with Dynamically Generated User-Defined Column Names?

使用用户定义的字段名称转置 SQL 表数据

透视数据或转置数据涉及转换表,其中列代表属性和行代表表中的实体数据,其中行代表属性,列代表实体数据。在使用用户定义的字段名称时,这通常很有用,如提供的示例表中所示。

转置表的查询

要转置给定的表,您可以使用SQL函数和条件语句的组合,如图下面:

SELECT t.UserId,
       MAX(CASE WHEN t.FieldName = 'Username' THEN t.FieldValue ELSE NULL END) AS Username,
       MAX(CASE WHEN t.FieldName = 'Password' THEN t.FieldValue ELSE NULL END) AS Password,
       MAX(CASE WHEN t.FieldName = 'Email Address' THEN t.FieldValue ELSE NULL END) AS Email
FROM t
GROUP BY t.UserId
登录后复制

说明

  • MAX 函数返回每列的最大值,该最大值对应于特定字段名称的字段值。
  • CASE 语句计算 FieldName 列,并为 WHERE 中出现的每个字段名称返回相应的 FieldValue
  • GROUP BY 子句按 UserId 对结果进行分组,确保每个用户的数据放置在单独的行中。

使用预准备语句的动态查询

要处理动态字段名称列表,您可以利用 MySQL 的准备语句(动态 SQL)语法:

SET @sql = 'SELECT UserId, ';
SELECT GROUP_CONCAT(CONCAT('MAX(CASE WHEN FieldName = ''', FieldName, ''' THEN FieldValue ELSE NULL END) AS ', FieldName)) INTO @sql FROM (SELECT DISTINCT FieldName FROM t);
SET @sql = CONCAT(@sql, ' FROM t GROUP BY UserId');
PREPARE stmt FROM @sql;
EXECUTE stmt;
登录后复制

此查询根据表中不同的字段名称动态构建 SQL 语句,并使用准备好的语句执行它。

以上是如何使用动态生成的用户定义列名转置 SQL 表数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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