学生成绩表(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
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
转载地址:http://blog.sina.com.cn/s/blog_9d37865901012g4t.html