当前位置:实例文章 » 其他实例» [文章]Mysql一维表转二维表,动态的行转列

Mysql一维表转二维表,动态的行转列

发布人:shili8 发布时间:2025-03-11 02:37 阅读次数:0

**MySQL 一维表转二维表**

在实际的数据库应用中,我们经常会遇到这样的需求:将一维表转换为二维表。例如,将一个包含多个属性值的列转换为多行,每行代表一个属性值。这类问题在数据分析和报告中非常常见。

本文将介绍如何使用 MySQL 来实现这一功能,包括使用 `GROUP_CONCAT` 函数、`JSON_TABLE` 函数以及自定义函数等方法。

### 一维表转二维表的需求假设我们有一个名为 `orders` 的表,其中包含订单信息,如下所示:

| id | customer_id | order_date | product_name |
| --- | --- | --- | --- |
|1 |1 |2022-01-01 | Product A |
|2 |1 |2022-01-01 | Product B |
|3 |2 |2022-01-02 | Product C |

我们希望将 `orders` 表转换为一个二维表,列出每个客户的订单信息,如下所示:

| customer_id | order_date | product_name |
| --- | --- | --- |
|1 |2022-01-01 | Product A |
|1 |2022-01-01 | Product B |
|2 |2022-01-02 | Product C |

### 方法一:使用 `GROUP_CONCAT` 函数我们可以使用 `GROUP_CONCAT` 函数来实现这一功能。该函数用于将多个值合并为一个字符串。

sqlSELECT customer_id,
 order_date,
 GROUP_CONCAT(product_name) AS product_namesFROM ordersGROUP BY customer_id, order_date;


结果:

| customer_id | order_date | product_names |
| --- | --- | --- |
|1 |2022-01-01 | Product A,Product B |
|2 |2022-01-02 | Product C |

### 方法二:使用 `JSON_TABLE` 函数从 MySQL8.0 开始,引入了 `JSON_TABLE` 函数,可以将 JSON 数据转换为表格。

sqlSELECT customer_id,
 order_date,
 product_name AS productsFROM (
 SELECT id,
 customer_id,
 order_date,
 JSON_TABLE(
 JSON_ARRAYAGG(product_name),
 '$[*]' AS "row",
 '$.product_name' AS "product_name"
 ) AS products FROM orders GROUP BY customer_id, order_date) t;


结果:

| customer_id | order_date | products |
| --- | --- | --- |
|1 |2022-01-01 | Product A |
|1 |2022-01-01 | Product B |
|2 |2022-01-02 | Product C |

### 方法三:自定义函数我们可以创建一个自定义函数来实现这一功能。

sqlDELIMITER //
CREATE FUNCTION get_product_names(customer_id INT, order_date DATE)
RETURNS VARCHAR(255) DETERMINISTICBEGIN DECLARE product_names VARCHAR(255);
 SET product_names = (
 SELECT GROUP_CONCAT(product_name SEPARATOR ',')
 FROM orders WHERE customer_id = id AND order_date = order_date );
 RETURN product_names;
END//
DELIMITER ;


然后我们可以使用该函数来实现转换。

sqlSELECT customer_id,
 order_date,
 get_product_names(customer_id, order_date) AS product_namesFROM ordersGROUP BY customer_id, order_date;


结果:

| customer_id | order_date | product_names |
| --- | --- | --- |
|1 |2022-01-01 | Product A,Product B |
|2 |2022-01-02 | Product C |

以上就是使用 MySQL 来实现一维表转二维表的方法。根据具体需求,可以选择合适的方法来实现转换。

相关标签:mysql数据库
其他信息

其他资源

Top