mysql怎么把行转成列
时间 : 2023-03-14 07:40:01声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在MySQL中,可以使用聚合函数和GROUP BY语句来进行行列转换。下面介绍一些常用的方法。

1. 使用GROUP BY和聚合函数

这是最常用的方法之一。首先,使用GROUP BY语句将要聚合的列分组。然后,使用聚合函数将分组后的行转换成列。

例如,以下是一个orders表:

| order_id | customer_id | order_date | order_amount |

|----------|-------------|------------|--------------|

| 1 | 1 | 2021-01-01 | 100 |

| 2 | 1 | 2021-01-05 | 200 |

| 3 | 2 | 2021-01-08 | 150 |

| 4 | 2 | 2021-01-10 | 300 |

现在,我们想把customer_id作为列,把order_date作为行,把order_amount作为值进行转换。可以使用以下查询:

SELECT order_date,

SUM(CASE WHEN customer_id = 1 THEN order_amount ELSE 0 END) AS customer_1,

SUM(CASE WHEN customer_id = 2 THEN order_amount ELSE 0 END) AS customer_2

FROM orders

GROUP BY order_date

该查询会将结果转换成以下形式:

| order_date | customer_1 | customer_2 |

|------------|-------------|-------------|

| 2021-01-01 | 100 | 0 |

| 2021-01-05 | 200 | 0 |

| 2021-01-08 | 0 | 150 |

| 2021-01-10 | 0 | 300 |

这种方法的缺点是需要手动指定列的名称,如果列的数量非常多,就会很麻烦。

2. 使用PIVOT语句

MySQL 8.0以上版本引入了PIVOT语句,可以更方便地进行行列转换。

使用PIVOT语句,可以将上述查询改写为如下形式:

SELECT *

FROM (

SELECT order_date, customer_id, order_amount

FROM orders

) AS o

PIVOT (

SUM(order_amount)

FOR customer_id IN (1, 2)

) AS p

PIVOT语句的基本语法如下:

SELECT *

FROM (

SELECT pivot_column, grouping_column, aggregate_expression

FROM source_table

) AS derived_table

PIVOT (

aggregate_function(aggregate_expression)

FOR pivot_column IN (value1, value2, ...)

) AS pivot_table

其中,pivot_column是要转换的列,grouping_column是分组的依据,aggregate_expression是要聚合的列,aggregate_function是聚合函数。

上面的查询中,PIVOT语句中的SUM(order_amount)表示对order_amount列进行求和,FOR customer_id IN (1, 2)表示将customer_id列转换成两列,分别为1和2。

3. 使用UNPIVOT语句

如果需要将列转换成行,可以使用UNPIVOT语句。

例如,以下为一个sales表:

| id | January | February | March | April | May | June |

|----|---------|----------|--------|--------|------|-------|

| 1 | 100 | 120 | 80 | 140 | 200 | 150 |

| 2 | 200 | 180 | 160 | 140 | 120 | 100 |

| 3 | 300 | 150 | 120 | 90 | 60 | 30 |

现在,我们想把每个月份的销售额作为行,把id作为列,把值作为列。

可以使用以下查询:

SELECT id, month, sales

FROM (

SELECT id, January, February, March, April, May, June

FROM sales

) AS s

UNPIVOT (

sales FOR month IN (January, February, March, April, May, June)

) AS u

这将结果转换为以下形式:

| id | month | sales |

|----|-----------|-------|

| 1 | January | 100 |

| 1 | February | 120 |

| 1 | March | 80 |

| 1 | April | 140 |

| 1 | May | 200 |

| 1 | June | 150 |

| 2 | January | 200 |

| 2 | February | 180 |

| 2 | March | 160 |

| 2 | April | 140 |

| 2 | May | 120 |

| 2 | June | 100 |

| 3 | January | 300 |

| 3 | February | 150 |

| 3 | March | 120 |

| 3 | April | 90 |

| 3 | May | 60 |

| 3 | June | 30 |

同样地,UNPIVOT语句中的sales FOR month IN (January, February, March, April, May, June)表示将每个月份的销售额转换成行,列的名称为month,值的名称为sales。

总的来说,MySQL的行列转换可以使用GROUP BY和聚合函数、PIVOT语句以及UNPIVOT语句来实现。具体方法根据实际情况选择即可。

在MySQL中,可以使用PIVOT和UNPIVOT函数将行转换为列和列转换为行。这是SQL Server中的常见操作,也可以在MySQL中实现。虽然MySQL中没有直接等效的PIVOT和UNPIVOT函数,但可以使用一些技巧实现类似的功能。

一种方法是使用CASE语句来将行转换为列。例如,考虑以下表格:

CREATE TABLE scores ( name VARCHAR(20), subject VARCHAR(20), score INT );

该表格包含学生姓名,课程名称和分数。为了将行转换为列,可以使用以下查询:

SELECT name,

MAX(CASE WHEN subject = 'Math' THEN score END) AS Math,

MAX(CASE WHEN subject = 'Science' THEN score END) AS Science,

MAX(CASE WHEN subject = 'History' THEN score END) AS History

FROM scores

GROUP BY name;

这会将每个学生的成绩转换为列,其中列名是课程名。如果需要在结果集中包含所有课程,可以在查询中使用动态SQL。

另一种方法是使用UNION ALL和SELECT TOP 1来将列转换为行。例如,考虑以下表格:

CREATE TABLE stats ( year INT, category VARCHAR(20), value INT );

该表格包含每个年份和类别的值。为了将列转换为行,可以使用以下查询:

SELECT year,

(SELECT value FROM stats WHERE year = s.year AND category = 'A') AS A,

(SELECT value FROM stats WHERE year = s.year AND category = 'B') AS B,

(SELECT value FROM stats WHERE year = s.year AND category = 'C') AS C

FROM (SELECT DISTINCT year FROM stats) s;

这会将每个年份和类别的值转换为行,其中列名是类别名称。

需要注意的是,以上两种方法都需要手动指定转换后的列名。如果需要进行动态转换,请使用动态SQL来生成查询语句。