学生成绩表的行列转换并显示优良中差解决思路
学生成绩表的行列转换并显示优良中差
数据表原内容如下:
id name subject score
----------------------------------
1 张三 语文 80
2 张三 数学 60
3 张三 英语 90
4 李四 语文 92
5 李四 数学 65
6 李四 英语 78
想要查询并显示成如下样式:
姓名 语文 数学 英语
----------------------------------
李四 92 65 78
张三 80 60 90
这个要求我用CASE-WHEN-THEN-END结构的语句实现了。语句如下:
现在我现在想要查询并显示成如下结果:
(80分及以上为优,60-79为良,小于60为差)
姓名 语文 数学 英语
----------------------------------------
李四 优 良 良
张三 优 良 优
我想到的查询方法如下:
第一个查询语句,貌似就是这样的,但是第二个查询语句,我总感觉有点长了。大家有没有更好的方法啊?
------解决方案--------------------
2005以上版本可以使用pivot实现,自己查一下资料,这样的例题很多
------解决方案--------------------
数据表原内容如下:
id name subject score
----------------------------------
1 张三 语文 80
2 张三 数学 60
3 张三 英语 90
4 李四 语文 92
5 李四 数学 65
6 李四 英语 78
想要查询并显示成如下样式:
姓名 语文 数学 英语
----------------------------------
李四 92 65 78
张三 80 60 90
这个要求我用CASE-WHEN-THEN-END结构的语句实现了。语句如下:
- SQL code
SELECT [name] AS 姓名, MAX( CASE subject WHEN '语文' THEN score END) AS 语文, MAX( CASE subject WHEN '数学' THEN score END) AS 数学, MAX( CASE subject WHEN '英语' THEN score END) AS 英语 FROM student GROUP BY [name]
现在我现在想要查询并显示成如下结果:
(80分及以上为优,60-79为良,小于60为差)
姓名 语文 数学 英语
----------------------------------------
李四 优 良 良
张三 优 良 优
我想到的查询方法如下:
- SQL code
SELECT [name] AS 姓名, MAX( CASE subject WHEN '语文' THEN (CASE WHEN score>=80 THEN '优' WHEN score<80 AND score >=60 THEN '良' WHEN score<60 THEN '差' END ) END) AS 语文, MAX( CASE subject WHEN '数学' THEN (CASE WHEN score>=80 THEN '优' WHEN score<80 AND score >=60 THEN '良' WHEN score<60 THEN '差' END ) END) AS 数学, MAX( CASE subject WHEN '英语' THEN (CASE WHEN score>=80 THEN '优' WHEN score<80 AND score >=60 THEN '良' WHEN score<60 THEN '差' END ) END) AS 英语 FROM student GROUP BY [name]
第一个查询语句,貌似就是这样的,但是第二个查询语句,我总感觉有点长了。大家有没有更好的方法啊?
------解决方案--------------------
2005以上版本可以使用pivot实现,自己查一下资料,这样的例题很多
------解决方案--------------------
- SQL code
--2000觉得长,只有把优良差先处理了 SELECT [name] AS 姓名, MAX( CASE subject WHEN '语文' THEN score END) AS 语文, MAX( CASE subject WHEN '数学' THEN score END) AS 数学, MAX( CASE subject WHEN '英语' THEN score END) AS 英语 FROM (select name,subject, CASE WHEN score>=80 THEN '优' WHEN score<80 AND score >=60 THEN '良' WHEN score<60 THEN '差' END score from student ) as a GROUP BY [name] --2005 select * from (select name,subject, CASE WHEN score>=80 THEN '优' WHEN score<80 AND score >=60 THEN '良' WHEN score<60 THEN '差' END score from student) as a pivot(max(score) for subject in(语文,数学,英语))b