纵向变成横向

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

转换成

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

建表插入数据

CREATE TABLE students (
	`Name` VARCHAR (50),
	`Subject` VARCHAR (50),
	`Result` INT (11)
);

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

转换语句

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

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

建表插入数据

CREATE TABLE students_1 (
	`姓名` VARCHAR (50),
	`语文` VARCHAR (50),
	`数学` VARCHAR (50),
	`物理` VARCHAR (50)
);

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

转换语句

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