现在的位置: 首页 > 综合 > 正文

sql统计-关于学生成绩

2013年10月28日 ⁄ 综合 ⁄ 共 3905字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.