MySQL 中的动态透视
在 MySQL 中,表通常包含标准化格式的数据,需要复杂的查询来检索更多用户中的数据- 友好的格式。其中一种转换是数据透视,其中列转换为行。
考虑一个像“零件”这样的表,它将产品零件 (part_id) 与产品类型 (part_type) 和产品 ID (product_id) 相关联。我们希望对该表进行透视以创建一个新表,以显示不同零件类型的每个产品的零件 ID。
MySQL 缺乏专用的 PIVOT 函数,因此我们需要使用替代技术。一种解决方案涉及使用聚合函数和 CASE 语句。对于动态数据透视,我们可以利用准备好的语句。
动态透视查询
以下查询使用动态 SQL 来透视“Parts”表:
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when part_type = ''', part_type, ''' then part_id end) AS part_', part_type, '_id' ) ) INTO @sql FROM parts; SET @sql = CONCAT('SELECT product_id, ', @sql, ' FROM parts GROUP BY product_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
此查询根据表中存在的不同部分类型动态生成 SQL 语句,并使用准备好的语句执行它以改进
结果示例
结果表将具有以下格式:
product_id part_A_id part_B_id ---------------------------------------- 1 1 2 2 3 4 3 5 6
静态数据透视查询
对于有限数量的零件类型,静态数据透视查询可以是使用:
select product_id, max(case when part_type ='A' then part_id end) as Part_A_Id, max(case when part_type ='B' then part_id end) as Part_B_Id from parts group by product_id
此查询手动指定零件类型并生成数据透视表。
以上是如何使用准备好的语句在 MySQL 中执行动态透视?的详细内容。更多信息请关注PHP中文网其他相关文章!