数据表原内容如下:
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 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