成绩"/>
sql 统计-关于学生成绩
sql统计-关于学生成绩
学生成绩表(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. 计算每个人的总成绩并排名
order by后的字段必须是原始表中的已经存在的字段,或者根据原始表生成的数据。
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。.html
ORDER BY 关键字用于对结果集进行排序。 .html
2. 计算每个人的总成绩并排名
(
select stuid, sum(score) as allscore from stuscore group by stuid
)t2
where t1.stuid =t2.stuid
order by t2.allscore desc
3. 计算每个人单科的最高成绩
(
select stuid, max(score) as maxscore from stuscore group by stuid
) t2
where t1.stuid =t2.stuid and t1.score =t2.maxscore
4.计算每个人的平均成绩
(
select stuid, avg(score) as avgscore from stuscore group by stuid
) t2
where t1.stuid =t2.stuid
5.列出各门课程成绩最好的学生
(
select subject, max(score) as maxscore from stuscore group by subject
) t2
where t1.subject =t2.subject and t1.score =t2.maxscore
6.列出各门课程成绩最好的两位学生
where t1.stuid in
( select top 2 stuscore.stuid from stuscore where subject = t1.subject order by score desc)
order by t1.subject
7.学号 姓名 语文 数学 英语 总分 平均分
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.列出各门课程的平均成绩
group by subject
9.列出数学成绩的排名
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 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. 求出李四的数学成绩的排名
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
更多推荐
sql 统计-关于学生成绩
发布评论