1. 程式人生 > >SQL Server行列轉換

SQL Server行列轉換

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 StuScore2
	UNION ALL 
	SELECT StuName AS '姓名', '數學' AS '科目', Mathematical AS '成績' FROM StuScore2
	UNION 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

執行結果: