MySQL 分组行专列 分列显示
时间: 2024-03-16 22:43:41 浏览: 56
MySQL的行转列和列转行可以使用条件语句和聚合函数来实现,具体的方法如下:
1. 行转列
假设有如下的数据表:
```
+----+-------+-------+
| id | name | score |
+----+-------+-------+
| 1 | Alice | 90 |
| 1 | Alice | 80 |
| 2 | Bob | 70 |
| 2 | Bob | 50 |
| 2 | Bob | 60 |
+----+-------+-------+
```
需要将每个学生的成绩转换为一行,可以使用如下的SQL语句:
```
SELECT id, name,
MAX(CASE WHEN rn = 1 THEN score END) AS score1,
MAX(CASE WHEN rn = 2 THEN score END) AS score2,
MAX(CASE WHEN rn = 3 THEN score END) AS score3
FROM (
SELECT id, name, score,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY score DESC) AS rn
FROM table_name
) t
GROUP BY id, name;
```
以上SQL语句使用ROW_NUMBER()窗口函数为每个学生的成绩排名,并使用CASE语句将每个成绩转换为一列。最终的查询结果将包含多列,分别为学生ID、学生姓名、成绩1、成绩2、成绩3。
2. 列转行
假设有如下的数据表:
```
+----+-------+------+------+------+
| id | name | sub1 | sub2 | sub3 |
+----+-------+------+------+------+
| 1 | Alice | 90 | 80 | 70 |
| 2 | Bob | 60 | 50 | 40 |
+----+-------+------+------+------+
```
需要将每个学生的科目成绩转换为一行,可以使用如下的SQL语句:
```
SELECT id, name, subject, score
FROM (
SELECT id, name, sub1, sub2, sub3
FROM table_name
) t
UNPIVOT (
score FOR subject IN (sub1, sub2, sub3)
) u;
```
以上SQL语句使用UNPIVOT操作将每个科目成绩转换为一行。最终的查询结果将包含四列,分别为学生ID、学生姓名、科目名称、成绩。
阅读全文