sql统计-关于学生成绩

学生成绩表(stuscore):

姓名:name
课程:subject
分数:score
学号:stuid
张三
数学
89
1
张三
语文
80
1
张三
英语
70
1
李四
数学
90
2
李四
语文
70
2
李四
英语
80
2

创建表
问题:
1.    计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)
2.    计算每个人的总成绩并排名(要求显示字段: 学号,姓名,总成绩)
3.    计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最高成绩)
4.    计算每个人的平均成绩(要求显示字段: 学号,姓名,平均成绩)
5.    列出各门课程成绩最好的学生(要求显示字段: 学号,姓名,科目,成绩)
6.    列出各门课程成绩最好的两位学生(要求显示字段: 学号,姓名,科目,成绩)
7.    统计如下:
学号
姓名
语文
数学
英语
总分
平均分
 
 
 
 
 
 
 
 
8.列出各门课程的平均成绩(要求显示字段:课程,平均成绩)
9.列出数学成绩的排名(要求显示字段:学号,姓名,成绩,排名)
10.列出数学成绩在2-3名的学生(要求显示字段:学号,姓名,科目,成绩)
11.求出李四的数学成绩的排名
12.统计如下:
课程
不及格(0-59)个
良(60-80)个
优(81-100)个
 
 
 
 
  
 
13.统计如下:数学:张三(50分),李四(90分),王五(90分),赵六(76分)
答案:
13. 数学: 张三 (50 ), 李四 (90 ), 王五 (90 ), 赵六 (76 )
declare  @s  varchar ( 1000 )

set  @s = ''

select  @s  = @s + ' , ' + name + ' ( ' + convert ( varchar ( 10 ),score) + ' 分) '  from  stuscore  where  subject = ' 数学 '  

set  @s = stuff ( @s , 1 , 1 , '' )

print  ' 数学: ' + @s
 
1.       计算每个人的总成绩并排名
select  name, sum (score)  as  allscore  from  stuscore  group  by  name  order  by  allscore

2.   计算每个人的总成绩并排名
select  distinct  t1.name,t1.stuid,t2.allscore  from   stuscore t1,

(

    
select  stuid, sum (score)  as  allscore  from  stuscore  group  by  stuid

)t2

where  t1.stuid = t2.stuid

order  by  t2.allscore  desc
3. 计算每个人单科的最高成绩
  select  t1.stuid,t1.name,t1.subject,t1.score  from  stuscore t1,

(

select  stuid, max (score)  as  maxscore  from  stuscore  group  by  stuid

) t2

where  t1.stuid = t2.stuid  and  t1.score = t2.maxscore
4. 计算每个人的平均成绩
select  distinct  t1.stuid,t1.name,t2.avgscore  from  stuscore t1,

(

select  stuid, avg (score)  as  avgscore  from  stuscore  group  by  stuid

) t2

where  t1.stuid = t2.stuid
5. 列出各门课程成绩最好的学生
select   t1.stuid,t1.name,t1.subject,t2.maxscore  from  stuscore t1,

(

select  subject, max (score)  as  maxscore  from  stuscore  group  by  subject

) t2

where  t1.subject = t2.subject  and  t1.score = t2.maxscore

6. 列出各门课程成绩最好的两位学生
select  distinct  t1. *  from  stuscore t1 

where  t1.stuid  in  

(
select  top  2  stuscore.stuid  from  stuscore  where  subject  =  t1.subject  order  by  score  desc

order  by  t1.subject

7.学号     姓名    语文     数学     英语     总分  平均分
select  stuid  as  学号,name  as  姓名,

sum ( case  when  subject = ' 语文 '  then  score  else  0  end as  语文,

sum ( case  when  subject = ' 数学 '  then  score  else  0  end as  数学,

sum ( case  when  subject = ' 英语 '  then  score  else  0  end as  英语,

sum (score)  as  总分,( sum (score) / count ( * ))  as  平均分

from  stuscore

group  by  stuid,name 

order  by  总分desc
8. 列出各门课程的平均成绩
select  subject, avg (score)  as  avgscore  from  stuscore

group  by  subject
9. 列出数学成绩的排名
declare  @tmp  table (pm  int ,name  varchar ( 50 ),score  int ,stuid  int )

insert  into  @tmp  select  null ,name,score,stuid  from  stuscore  where  subject = ' 数学 '  order  by  score  desc

declare  @id  int

set  @id = 0 ;

update  @tmp  set  @id = @id + 1 ,pm = @id

select  *  from  @tmp  

 
select   DENSE_RANK ()  OVER ( order  by  score  desc as  row,name,subject,score,stuid  from  stuscore  where  subject = ' 数学 '

order  by  score  desc

declare  @tmp  table (pm  int  identity ( 1 , 1 ),name  varchar ( 50 ),score  int ,stuid  int )
insert  into  @tmp  
select  name,score,stuid  from  stuscore  where  subject = ' 数学 '  order  by  score  desc
select  *  from  @tmp

10. 列出数学成绩在2-3 名的学生
select  t3. *    from

(

select  top  2  t2. *    from  (

select  top  3  name,subject,score,stuid  from  stuscore  where  subject = ' 数学 '

order  by  score  desc

) t2 
order  by  t2.score

) t3 
order  by  t3.score  desc
11. 求出李四的数学成绩的排名
declare  @tmp  table (pm  int ,name  varchar ( 50 ),score  int ,stuid  int )

insert  into  @tmp  select  null ,name,score,stuid  from  stuscore  where  subject = ' 数学 '  order  by  score  desc

declare  @id  int

set  @id = 0 ;

update  @tmp  set  @id = @id + 1 ,pm = @id

select  *  from  @tmp  where  name = ' 李四 '

12. 课程    不及格( -59    良( -80    优( -100
select  subject, 

(
select  count ( * from  stuscore  where  score < 60  and  subject = t1.subject)  as  不及格,

(
select  count ( * from  stuscore  where  score  between  60  and  80  and  subject = t1.subject)  as  良,

(
select  count ( * from  stuscore  where  score  > 80  and  subject = t1.subject)  as  优

from  stuscore t1  group  by  subject
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值