在 SQL 中,转置表涉及将面向行的表转换为面向列的表。这对于各种场景都很有用,例如创建用户摘要报告。
在 SQL 中实现转置的一种方法是使用 CASE 语句。考虑一个包含以下列的表:Id、UserId、FieldName 和 FieldValue,如提供的示例所示。
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
此查询将返回转置结果,按 UserId 对用户进行分组,并将相应的字段值分配给用户名、密码和电子邮件地址列。
但是,这种方法需要为每个字段定义 CASE 语句,这可能很乏味且不灵活。要使其动态化,您可以利用 MySQL 的准备语句(动态 SQL)语法。
SET @sql = CONCAT("SELECT userid"); -- Dynamically create the field selection part SET @field_list = ( SELECT GROUP_CONCAT( CONCAT('MAX(CASE WHEN t.fieldname = ''', fieldname, ''' THEN t.fieldvalue ELSE NULL END) AS ', fieldname) ) FROM t GROUP BY userid ); SET @sql = CONCAT(@sql, ", ", @field_list); SET @sql = CONCAT(@sql, " FROM t GROUP BY userid"); PREPARE stmt FROM @sql; EXECUTE stmt;
此查询使用子查询的结果构造动态 SQL 语句来确定字段选择部分。它使用 GROUP_CONCAT 函数连接 CASE 语句,确保动态构造的 SQL 查询有效。
通过使用动态 SQL,您可以避免手动定义 CASE 语句并保留灵活性,允许您的查询处理任意数量的 CASE 语句用户定义字段。
以上是如何使用准备好的语句在 SQL 中动态转置表?的详细内容。更多信息请关注PHP中文网其他相关文章!