sql统计-关于学生成绩(答案)
http://blog.sina.com.cn/s/blog_61380b320100ej9p.html
答案:
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
(
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
(
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
(
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
(
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
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
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
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
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
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
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
(
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 = ' 李四 '
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
分
)(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
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
set @s=''
select @s =@s+','+name+'('+convert(varchar(10),score)+'分)' from stuscore where subject='数学'
set @s=stuff(@s,1,1,'')
print '数学:'+@s