学生成绩表(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,allscore
order
by
sum(score)
order by后的字段必须是原始表中的已经存在的字段,或者根据原始表生成的数据。
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。http://www.runoob.com/sql/sql-groupby.html
ORDER BY 关键字用于对结果集进行排序。 http://www.runoob.com/sql/sql-orderby.html
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.列出数学成绩的排名
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