上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
4.5.1 案例一:实现行列转换
t_score是一个记录学生成绩的数据表,表的创建脚本可以通过“读者服务”获取,以下是该表中包含的数据:
其中字段sname表示学生姓名,cname表示课程名称,grade表示考试成绩。每行数据代表了一个学生一门学科的成绩。假如现在我们需要以每个学生一行数据的形式创建以下报表:
那么,应该如何编写查询语句呢?
这是一个典型的将行转换为列的问题,可以利用CASE表达式加上聚合函数实现。我们首先使用CASE表达式将每门学科转换为一列:
第1个CASE表达式用于转换学生的语文成绩,cname等于“语文”就返回对应的成绩,否则就返回0。同理,第2个和第3个CASE表达式分别用于转换数学和英语成绩。查询返回的结果如下:
接下来,我们通过分组汇总将每个学生的成绩合并成一条记录:
GROUP BY子句将数据按照学生进行分组,SUM函数对每门学科的成绩进行求和,学科成绩加上2个0还是学科成绩。这样我们就实现了上面的报表。