学生成绩表(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
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分)
答案:
13. 数学: 张三 (50 分 ), 李四 (90 分 ), 王五 (90 分 ), 赵六 (76 分 )
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
set @s = ''
select @s = @s + ' , ' + name + ' ( ' + convert ( varchar ( 10 ),score) + ' 分) ' from stuscore where subject = ' 数学 '
set @s = stuff ( @s , 1 , 1 , '' )
print ' 数学: ' + @s
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
( 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