SQL纵向变成横向,横向变成纵向

纵向变成横向

Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94

转换成

| 姓名 | 语文 | 数学 | 物理 |
| —— | —— | —— |
| 李四 | 74 | 84 | 94 |
| 张三 | 73 | 83 | 93 |

建表插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE students (
`Name` VARCHAR (50),
`Subject` VARCHAR (50),
`Result` INT (11)
);

INSERT INTO students
VALUES
('张三', '语文', '73'),
('张三', '数学', '83'),
('张三', '物理', '93'),
('李四', '语文', '74'),
('李四', '数学', '84'),
('李四', '物理', '94');

转换语句

这里的SUM也可以用MAX替代,都是取一条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SELECT
`Name` AS 姓名,
SUM(
CASE `Subject`
WHEN '语文' THEN
`Result`
ELSE
0
END
) AS '语文',
SUM(
CASE `Subject`
WHEN '数学' THEN
`Result`
ELSE
0
END
) AS '数学',
SUM(
CASE `Subject`
WHEN '物理' THEN
`Result`
ELSE
0
END
) AS '物理'
FROM
students
GROUP BY
NAME

横向变成纵向

| 姓名 | 语文 | 数学 | 物理 |
| —— | —— | —— |
| 李四 | 74 | 84 | 94 |
| 张三 | 73 | 83 | 93 |

转换成

Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94

建表插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE students_1 (
`姓名` VARCHAR (50),
`语文` VARCHAR (50),
`数学` VARCHAR (50),
`物理` VARCHAR (50)
);

INSERT INTO `students_1` (
`姓名`,
`语文`,
`数学`,
`物理`
)
VALUES
('张三', '73', '83', '93'),
('李四', '74', '84', '94');

转换语句

1
2
3
4
5
SELECT `姓名` AS 'Name', `语文` AS 'Subject', `语文` AS 'Result' FROM students_1 UNION
SELECT `姓名` AS 'Name', `数学` AS 'Subject', `数学` AS 'Result' FROM students_1 UNION
SELECT `姓名` AS 'Name', `物理` AS 'Subject', `物理` AS 'Result' FROM students_1
ORDER BY
`Name` DESC

参考自:CSDN-会飞的鱼online