学生成绩表的行列转换并显示优良中差
数据表原内容如下:
idnamesubjectscore
----------------------------------
1张三语文80
2张三数学60
3张三英语90
4李四语文92
5李四数学65
6李四英语78
想要查询并显示成如下样式:
姓名语文数学英语
----------------------------------
李四926578
张三806090
这个要求我用CASE-WHEN-THEN-END结构的语句实现了。语句如下:
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]
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]
--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