sql统计-关于学生成绩

转载地址:http://www.cnblogs.com/tenghoo/archive/2007/06/11/779240.html

 

学生成绩表(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

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值