ACCESS列转行SQL语句汇总成绩实例
时间: 2025-06-29 20:07:42 浏览: 4
### SQL 中实现列转行(透视)操作以汇总成绩
在SQL中,`PIVOT` 和 `UNPIVOT` 是用于转换数据方向的关键字。对于汇总成绩的需求,可以利用这些关键字来完成从列到行的数据转换。
#### 使用 PIVOT 进行列转行
假设有一个名为 `Scores` 的表,其中包含学生姓名 (`StudentName`)、科目名称 (`Subject`) 及其对应的分数 (`Score`) 字段:
| StudentName | Subject | Score |
|-------------|-------------|-------|
| Alice | Math | 90 |
| Bob | English | 85 |
| Charlie | Science | 78 |
要将上述表格中的每一门课程的成绩按照行的形式展示出来,则可以通过如下查询语句实现:
```sql
SELECT *
FROM (
SELECT StudentName, Subject, CAST(Score AS VARCHAR(10)) AS Score
FROM Scores
) p
UNPIVOT (
Value FOR ColumnName IN ([Math], [English], [Science])
) u;
```
此命令会把原始表里的各科目的成绩按照指定的方式展开成多条记录[^2]。
然而,在实际应用过程中更常见的是先做一次聚合运算再进行旋转处理。比如计算每位同学每门课的平均分并将其转化为横向排列的结果集。此时可采用下面的方法:
```sql
WITH AvgScores AS(
SELECT StudentName,
AVG(CASE WHEN Subject='Math' THEN Score ELSE NULL END) 'Math',
AVG(CASE WHEN Subject='English' THEN Score ELSE NULL END)'English',
AVG(CASE WHEN Subject='Science' THEN Score ELSE NULL END)'Science'
FROM Scores GROUP BY StudentName
)
SELECT * FROM AvgScores UNPIVOT(Value FOR Col IN([Math],[English],[Science]))AS unpvt;
```
这段代码首先创建了一个临时视图 `AvgScores` 来存储每个学生的各科学习情况;接着使用 `UNPIVOT` 将之前得到的宽格式数据变窄,最终实现了期望的效果——即由原来的多个字段表示不同学科变为单个字段加上相应的值列表达各个学科的信息[^4]。
请注意,具体语法可能会因所使用的数据库管理系统而异。以上例子适用于 Microsoft SQL Server 平台下的 T-SQL 编程环境。如果是在其他类型的 DBMS 上运行类似的查询,请参照相应产品的官方文档调整关键词和参数设置。
阅读全文
相关推荐














