日期:2014-05-18  浏览次数:20721 次

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

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