sql统计-关于学生成绩

学生成绩表(stuscore):

姓名:name

课程:subject

分数:score

学号:stuid

张三

数学

89

1

张三

语文

80

1

张三

英语

70

1

李四

数学

90

2

李四

语文

70

2

李四

英语

80

2

创建表
SET  ANSI_NULLS  ON

GO

SET  QUOTED_IDENTIFIER  ON

GO

SET  ANSI_PADDING  ON

GO

CREATE  TABLE  [dbo].[stuscore](

        [name]  [varchar](50)  COLLATE  Chinese_PRC_CI_AS  NULL,

        [subject]  [varchar](50)  COLLATE  Chinese_PRC_CI_AS  NULL,

        [score]  [int]  NULL,

        [stuid]  [int]  NULL

ON  [PRIMARY]

 

GO

SET  ANSI_PADDING  OFF

问题:

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

答案:

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  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  end)  as  语文,

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

sum(case  when  subject='英语'  then  score  else  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  t2.*    from  (

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



转载地址:http://blog.sina.com.cn/s/blog_9d37865901012g4t.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值