
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 SourceTablePIVOT ( 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 SourceTablePIVOT ( 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, scoreFROM ( SELECT name, shuxue, yuwen, yingyu FROM t_student_2) AS SourceTableUNPIVOT ( 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.columnsWHERE 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, scoreFROM t_student_2UNPIVOT ( score FOR subject IN (' + @columns + ')) AS UnpivotTable;';
EXEC sp_executesql @sql;
阅读原文:原文链接
该文章在 2025/6/14 16:49:10 编辑过