
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, '學(xué)生1', '語文', 80);INSERT INTO `t_student` VALUES (2, '學(xué)生1', '數(shù)學(xué)', 90);INSERT INTO `t_student` VALUES (3, '學(xué)生1', '英語', 99);INSERT INTO `t_student` VALUES (4, '學(xué)生2', '語文', 85);INSERT INTO `t_student` VALUES (5, '學(xué)生2', '數(shù)學(xué)', 92);
select name,sum(case course when '語文' then score else 0 end)as '語文',sum(case course when '數(shù)學(xué)' then score else 0 end)as '數(shù)學(xué)',sum(case course when '英語' then score else 0 end)as '英語' from t_student group by name
2.Sql Server實(shí)現(xiàn)方式 SELECT name,isnull([語文],0) as [語文],isnull([數(shù)學(xué)],0) as [數(shù)學(xué)],isnull([英語],0) as [英語]FROM ( SELECT name,course, score FROM t_student) AS SourceTablePIVOT ( MAX(score) -- 使用聚合函數(shù) FOR course IN ([數(shù)學(xué)], [語文], [英語]) -- 指定要轉(zhuǎn)換的列值) AS PivotTable;
2.2動(dòng)態(tài)實(shí)現(xiàn)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, '學(xué)生1', 88, 90, 92);INSERT INTO `t_student_2` VALUES (6, '學(xué)生2', 90, 88, 85);
select name,yuwen as 'score', '語文' as 'course' from t_student_2 union all select name,shuxue ,'數(shù)學(xué)' from t_student_2 union all select name,yingyu ,'英語' from t_student_2
2.SQL SERVER實(shí)現(xiàn)方式SELECT name, subject, scoreFROM ( SELECT name, shuxue, yuwen, yingyu FROM t_student_2) AS SourceTableUNPIVOT ( score FOR subject IN (shuxue, yuwen, yingyu)) AS UnpivotTable;
2.2動(dòng)態(tài)實(shí)現(xiàn)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 編輯過