
CREATE TABLE `t_student` (
`Id` int NOT NULL AUTO_INCREMENT,
`Name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`Course` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`Score` int NOT NULL DEFAULT 0,
PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO `t_student` VALUES (1, '学生1', '语文', 80);
INSERT INTO `t_student` VALUES (2, '学生1', '数学', 90);
INSERT INTO `t_student` VALUES (3, '学生1', '英语', 99);
INSERT INTO `t_student` VALUES (4, '学生2', '语文', 85);
INSERT INTO `t_student` VALUES (5, '学生2', '数学', 92);
select name,
sum(case course when '语文' then score else 0 end)as '语文',
sum(case course when '数学' then score else 0 end)as '数学',
sum(case course when '英语' then score else 0 end)as '英语'
from t_student group by name
SELECT name,isnull([语文],0) as [语文],isnull([数学],0) as [数学],isnull([英语],0) as [英语]
FROM (
SELECT name,course, score
FROM t_student
) AS SourceTable
PIVOT (
MAX(score) -- 使用聚合函数
FOR course IN ([数学], [语文], [英语]) -- 指定要转换的列值
) AS PivotTable;
DECLARE @columns NVARCHAR(MAX) = '';
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @columns = @columns + QUOTENAME(course) + ','
FROM (SELECT DISTINCT course FROM t_student) AS tmp;
SET @columns = LEFT(@columns, LEN(@columns) - 1);
SET @sql = '
SELECT *
FROM (
SELECT name, course, score
FROM t_student
) AS SourceTable
PIVOT (
MAX(score)
FOR course IN (' + @columns + ')
) AS PivotTable;';
EXEC sp_executesql @sql;
CREATE TABLE `t_student_2` (
`Id` int NOT NULL AUTO_INCREMENT,
`Name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`yuwen` int NOT NULL DEFAULT 0,
`shuxue` int NOT NULL DEFAULT 0,
`yingyu` int NOT NULL DEFAULT 0,
PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO `t_student_2` VALUES (1, '学生1', 88, 90, 92);
INSERT INTO `t_student_2` VALUES (6, '学生2', 90, 88, 85);
select name,yuwen as 'score', '语文' as 'course' from t_student_2
union all
select name,shuxue ,'数学' from t_student_2
union all
select name,yingyu ,'英语' from t_student_2
SELECT name, subject, score
FROM (
SELECT name, shuxue, yuwen, yingyu
FROM t_student_2
) AS SourceTable
UNPIVOT (
score FOR subject IN (shuxue, yuwen, yingyu)
) AS UnpivotTable;
DECLARE @columns NVARCHAR(MAX) = '';
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @columns = @columns + QUOTENAME(column_name) + ','
FROM information_schema.columns
WHERE table_name = 't_student_2' AND column_name != 'id' and column_name!='name';
SET @columns = LEFT(@columns, LEN(@columns) - 1);
SET @sql = '
SELECT name, subject, score
FROM t_student_2
UNPIVOT (
score FOR subject IN (' + @columns + ')
) AS UnpivotTable;';
EXEC sp_executesql @sql;
阅读原文:原文链接
该文章在 2025/6/14 16:49:10 编辑过