SQL Server 表格转置示例:添加平均分与总分

需积分: 3 1 下载量 183 浏览量 更新于2024-09-16 收藏 6KB TXT 举报
本文档主要介绍了如何在SQL Server数据库中使用不同的查询方法,针对一个名为`tb`的表,该表包含学生的姓名、所选课程以及对应分数,进行行列转换以展示每个学生在特定课程(最初仅限于语文、数学和物理)的最高分、最低分(这里假设没有提及最低分,但可以添加),以及如何扩展到SQL Server 2005版本来处理动态课程列表。在SQL Server 2000中,通过静态SQL查询,首先通过CASE语句分别计算每个学生的各科成绩,然后使用GROUP BY按姓名进行分组。对于SQL Server 2005,引入了Pivot操作来更方便地组织数据,使得结果集中显示课程列名和对应的分数。 为了实现题目中的要求,即在已有查询的基础上添加平均分和总分,我们需要对SQL查询进行适当的修改。首先,在静态SQL查询中,可以在每行数据之后添加平均分和总分的计算,例如: ```sql -- SQL SERVER 2000 静态SQL (扩展) SELECT 姓名, MAX(CASE WHEN 课程 = '语文' THEN 分数 ELSE 0 END) AS 语文, MAX(CASE WHEN 课程 = '数学' THEN 分数 ELSE 0 END) AS 数学, MAX(CASE WHEN 课程 = '物理' THEN 分数 ELSE 0 END) AS 物理, AVG(分数) AS 平均分, SUM(分数) AS 总分 FROM tb GROUP BY 姓名 ``` 对于SQL Server 2005,由于Pivot操作已经将分数聚合到了特定课程列,我们可以在查询结束后添加额外的计算: ```sql -- SQL SERVER 2005 静态SQL (扩展) WITH CourseScores AS ( SELECT * FROM (SELECT * FROM tb) a PIVOT (MAX(分数) FOR 课程 IN (语文, 数学, 物理)) b ) SELECT 姓名, 语文, 数学, 物理, AVG(CAST(SUM(分数) OVER (PARTITION BY 姓名) AS REAL)) AS 平均分, SUM(分数) AS 总分 FROM CourseScores ``` 动态SQL在这里可能不再适用,因为Pivot操作已经处理了课程和分数的组合。如果要支持动态课程,你可能需要先创建一个包含所有可能课程的临时表,然后在外部查询中再次进行Pivot或使用其他方法。 总结,这些示例展示了如何在SQL Server中处理行列转换,同时演示了如何逐步增加复杂度以满足额外的统计需求,如平均分和总分。这些查询不仅适用于固定课程列表,还能扩展到动态课程列表,提升了数据分析的灵活性。