SELECT 姓名, 考试类型, [数学], [英语], [物理], [化学]
FROM (
SELECT 姓名, 科目, 考试类型, 成绩
FROM Scores
UNPIVOT (
成绩 FOR 考试类型 IN ([期初考试], [期中考试], [期末考试])
) AS UnpivotedScores
) AS SourceData
PIVOT (
MAX(成绩)
FOR 科目 IN ([数学], [英语], [物理], [化学])
) AS PivotTable;
数据源

查询结果

以下是动态的sql,存储过程
DECLARE @Cols NVARCHAR(MAX), @Sql NVARCHAR(MAX);
-- 获取所有科目名称并生成列名列表
SELECT @Cols = STRING_AGG(QUOTENAME(科目), ', ')
FROM (SELECT DISTINCT 科目 FROM Scores) AS Subjects;
-- 构建动态SQL语句
SET @Sql = N'
SELECT 姓名, 考试类型, ' + @Cols + '
FROM (
SELECT 姓名, 科目, 考试类型, 成绩
FROM Scores
UNPIVOT (
成绩 FOR 考试类型 IN ([期初考试], [期中考试], [期末考试])
) AS UnpivotedScores
) AS SourceData
PIVOT (
MAX(成绩)
FOR 科目 IN (' + @Cols + ')
) AS PivotTable;';
-- 执行动态SQL
EXEC sp_executesql @Sql;
