首页 > 数据库 > mysql教程 > 如果没有本机 PIVOT 函数,如何在 MySQL 中动态透视数据?

如果没有本机 PIVOT 函数,如何在 MySQL 中动态透视数据?

Patricia Arquette
发布: 2025-01-06 07:24:39
原创
908 人浏览过

How can I dynamically pivot data in MySQL without a native PIVOT function?

MySQL 中的动态旋转

在我们的关系数据库中,我们有一个名为“Parts”的表,其中保存有关产品零件的信息,包括其零件零件 ID、零件类型和关联的产品 ID。表结构类似于以下内容:

Parts
--------------------------------------
part_id | part_type | product_id
--------------------------------------
1        | A        | 1
2        | B        | 1
3        | A        | 2
4        | B        | 2
5        | A        | 3
6        | B        | 3
登录后复制

目标:

我们的目标是构造一个查询,将此数据转换为透视格式,从而生成一个表每个唯一的产品 ID 占一行,以及代表“A”和“B”类型的相应部件 ID 的列。所需的输出表应如下所示:

Product_ID | Part_A_ID | Part _B_ID
----------------------------------------
1           | 1         | 2
2           | 3         | 4
3           | 5         | 6
登录后复制

解决方案:

不幸的是,MySQL 缺少原生的 PIVOT 函数。但是,我们可以使用聚合函数和 CASE 语句的组合来模拟其行为。为了创建处理多种零件类型的动态版本,我们使用准备好的语句:

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 语句。然后,它使用预准备语句执行生成的 SQL 语句,有效处理大型结果集的潜在性能问题。

列数有限的静态解决方案的替代方案:

如果我们的零件类型数量有限,我们可以采用静态版本的查询:

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
登录后复制

在以下情况下建议使用此替代方案:零件类型数量固定且较少。

以上是如果没有本机 PIVOT 函数,如何在 MySQL 中动态透视数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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