首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

学生成绩表的行列转换并显示优良中差解决思路

2012-03-22 
学生成绩表的行列转换并显示优良中差数据表原内容如下:idnamesubjectscore------------------------------

学生成绩表的行列转换并显示优良中差
数据表原内容如下:

idnamesubjectscore
----------------------------------
1张三语文80
2张三数学60
3张三英语90
4李四语文92
5李四数学65
6李四英语78



想要查询并显示成如下样式:

姓名语文数学英语
----------------------------------
李四926578
张三806090


这个要求我用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 studentGROUP 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 studentGROUP 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 aGROUP BY [name]--2005select * 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 

热点排行