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

Code_Star 2012-01-06 10:09:48
数据表原内容如下:

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结构的语句实现了。语句如下:

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为差)

姓名 语文 数学 英语
----------------------------------------
李四 优 良 良
张三 优 良 优

我想到的查询方法如下:


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]



第一个查询语句,貌似就是这样的,但是第二个查询语句,我总感觉有点长了。大家有没有更好的方法啊?
...全文
281 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Code_Star 2012-01-10
  • 打赏
  • 举报
回复
以前都不知道用pivot,看了两位的意见,尤其是第二位的具体case,再结合自己查的资料,相对了解一些了。谢谢各位,尤其是第二位大哥,劳你用心了。
美到心痛 2012-01-06
  • 打赏
  • 举报
回复

--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

  • 打赏
  • 举报
回复
2005以上版本可以使用pivot实现,自己查一下资料,这样的例题很多
use test/*一个项目涉及到的50个Sql语句问题及描述:--1.学生Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程 Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号--3.教师 Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名--4.成绩 SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数select * from Studentselect * from Courseselect * from Teacherselect * from SC*/--创建测试数据create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')insert into Student values('04' , N'李云' , '1990-08-06' , N'男')insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))insert into Course values('01' , N'语文' , '02')insert into Course values('02' , N'数学' , '01')insert into Course values('03' , N'英语' , '03')create table Teacher(T# varchar(10),Tname nvarchar(10))insert into Teacher values('01' , N'张三')insert into Teacher values('02' , N'李四')insert into Teacher values('03' , N'王五')create table SC(S# varchar(10),C# varchar(10),score decimal(18,1))insert into SC values('01' , '01' , 80)insert into SC values('01' , '02' , 90)insert into SC values('01' , '03' , 99)insert into SC values('02' , '01' , 70)insert into SC values('02' , '02' , 60)insert into SC values('02' , '03' , 80)insert into SC values('03' , '01' , 80)insert into SC values('03' , '02' , 80)insert into SC values('03' , '03' , 80)insert into SC values('04' , '01' , 50)insert into SC values('04' , '02' , 30)insert into SC values('04' , '03' , 20)insert into SC values('05' , '01' , 76)insert into SC values('05' , '02' , 87)insert into SC values('06' , '01' , 31)insert into SC values('06' , '03' ,

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧