1、行列转换
创建创建学生成绩表并添加学生成绩信息。
/*-创建学生成绩表-*/
CREATE TABLE StuScore
(StuName VARCHAR(20), --姓名Subject VARCHAR(20), --科目Score INT --成绩
);/*-添加学生成绩信息-*/
INSERT INTO StuScore VALUES('张三','语文',60);
INSERT INTO StuScore VALUES('张三','数学',80);
INSERT INTO StuScore VALUES('张三','英语',70);
INSERT INTO StuScore VALUES('李四','语文',50);
INSERT INTO StuScore VALUES('李四','数学',90);
INSERT INTO StuScore VALUES('李四','英语',60);
INSERT INTO StuScore VALUES('王五','语文',80);
INSERT INTO StuScore VALUES('王五','数学',40);
1.1 使用Case WHEN 实现行转列
/*-使用Case WHEN 实现行转列-*/
SELECT StuName AS '姓名',MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文',MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学',MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语',SUM(Score) AS '总分',AVG(Score) AS '平均分'
FROM StuScore
GROUP BY StuName
执行结果:
1.2 使用PIVOT实现行转列
/*-使用PIVOT实现行转列-*/
SELECT PVT.StuName AS '姓名',PVT.语文,PVT.数学,PVT.英语
FROM StuScore
PIVOT(MAX(Score) FOR Subject IN(语文,数学,英语)) AS PVT
执行结果:
2、列行转换
创建创建学生成绩表2并添加学生成绩信息。
/*-创建学生成绩表2-*/
CREATE TABLE StuScore2
(StuName VARCHAR(20), --姓名Chinese INT, --语文成绩Mathematical INT, --数学成绩English INT --英语成绩
);/*-添加学生成绩信息-*/
INSERT INTO StuScore2 VALUES('张三',60,80,70);
INSERT INTO StuScore2 VALUES('李四',50,90,60);
INSERT INTO StuScore2 VALUES('王五',80,40,50);
2.1 使用UNION实现列转行
/*-使用UNION实现列转行-*/
SELECT * FROM (SELECT StuName AS '姓名', '语文' AS '科目', Chinese AS '成绩' FROM StuScore2UNION ALL SELECT StuName AS '姓名', '数学' AS '科目', Mathematical AS '成绩' FROM StuScore2UNION ALL SELECT StuName AS '姓名', '英语' AS '科目', English AS '成绩' FROM StuScore2
) T
执行结果:
2.2 使用UNPIVOT实现列转行
/*-使用UNPIVOT实现列转行-*/
SELECT *
FROM StuScore2
UNPIVOT(Score FOR Subject IN(Chinese,Mathematical,English)) T
执行结果: