MySQL将多行转换为列
在本文中,我们将介绍如何将MYSQL中的多行转换为列。当我们需要将多行数据展示为一行数据时,这个方法非常有用。通常,我们将一些列重复列如题目所述地多次出现,那么将其转换为列可以更好地呈现数据。
阅读更多:MySQL 教程
使用CASE WHEN语句
首先,我们来看看如何使用CASE WHEN语句将多行数据转换为列。
假设我们有以下表格:
| id | order | amount |
|---|---|---|
| 1 | a | 100 |
| 1 | b | 200 |
| 1 | c | 300 |
| 2 | a | 400 |
| 2 | b | 500 |
| 2 | c | 600 |
我们可以使用以下SQL语句将数据转换为列:
SELECT
id,
SUM(CASE WHEN `order` = 'a' THEN amount ELSE 0 END) AS a,
SUM(CASE WHEN `order` = 'b' THEN amount ELSE 0 END) AS b,
SUM(CASE WHEN `order` = 'c' THEN amount ELSE 0 END) AS c
FROM
orders
GROUP BY id;
以上SQL语句将order列中的每个值转换为一个列。对于每个订单,如果它的order值与我们所选的值相同,则为金额累加器加上相应的金额。否则,累加器将保持原来的值。
运行以上SQL语句,得到以下结果:
| id | a | b | c |
|---|---|---|---|
| 1 | 100 | 200 | 300 |
| 2 | 400 | 500 | 600 |
我们可以看到,每行的order值已被转换为一个单独的列。
使用GROUP_CONCAT函数
除了使用CASE WHEN语句之外,我们还可以使用GROUP_CONCAT函数来将多行数据转换为列。
假设我们有以下表格:
| id | name | value |
|---|---|---|
| 1 | property | 10 |
| 1 | tax | 20 |
| 1 | fee | 30 |
| 2 | property | 40 |
| 2 | tax | 50 |
| 2 | fee | 60 |
我们可以使用以下SQL语句将数据转换为列:
SELECT
id,
GROUP_CONCAT(
CASE
WHEN name = 'property' THEN value
ELSE NULL
END
) AS property,
GROUP_CONCAT(
CASE
WHEN name = 'tax' THEN value
ELSE NULL
END
) AS tax,
GROUP_CONCAT(
CASE
WHEN name = 'fee' THEN value
ELSE NULL
END
) AS fee
FROM
data
GROUP BY id;
以上SQL语句将name列中的每个值转换为一个列。对于每个项目,只有当它名称匹配时,才会将其值添加到相应的列中。
运行以上SQL语句,得到以下结果:
| id | property | tax | fee |
|---|---|---|---|
| 1 | 10 | 20 | 30 |
| 2 | 40 | 50 | 60 |
我们可以看到,每行的name值已被转换为一个单独的列。
使用GROUP BY WITH ROLLUP
有时,我们需要将多行数据转换为列并显示总计。在这种情况下,可以使用GROUP BY WITH ROLLUP语句。
假设我们有以下表格:
| region | product | sales |
|---|---|---|
| Asia | Phone | 100 |
| Asia | Laptop | 200 |
| Europe | Phone | 300 |
| Europe | Laptop | 400 |
我们可以使用以下SQL语句将数据转换为列并显示总计:
SELECT
IFNULL(region, 'Total') AS region,
SUM(CASE WHEN product = 'Phone' THEN sales ELSE 0 END) AS phone_sales,
SUM(CASE WHEN product = 'Laptop' THEN sales ELSE 0 END) AS laptop_sales,
SUM(sales) AS total_sales
FROM
sales
GROUP BY region WITH ROLLUP;
以上SQL语句将product列中的每个值转换为一个列,并在最后添加了一个总计列。使用GROUP BY WITH ROLLUP语句,我们可以轻松地计算总计。
运行以上SQL语句,得到以下结果:
| region | phone_sales | laptop_sales | total_sales |
|---|---|---|---|
| Asia | 100 | 200 | 300 |
| Europe | 300 | 400 | 700 |
| Total | 400 | 600 | 1000 |
我们可以看到,每个地区和总计都已被转换为一个单独的列。
总结
在MYSQL中,将多行数据转换为列可以更好地呈现数据。使用CASE WHEN语句或GROUP_CONCAT函数,我们可以将每行中的每个值转换为一个单独的列。使用GROUP BY WITH ROLLUP语句,我们还可以计算总计。
极客笔记