如何用sql语句实现成绩求平均分、名次

lilyhappyday 2009-10-03 03:44:52
有一个数据表,格式如下:

班级 姓名 科目 成绩
(1)班 小明 语文 85
(1)班 小明 数学 90
(1)班 小兰 语文 83
(1)班 小兰 数学 95
(1)班 小欢 语文 86
(1)班 小欢 数学 91
(2)班 小花 语文 87
(2)班 小花 数学 89

现在要求如下
1. 用sql语句求出(1)班的各个学生的成绩的平均分

2. 用sql语句求出(1)班的平均前2名分别是谁

3. 用sql语句判断(1)班的单科成绩都大于85分的是谁
...全文
6751 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lidenyan 2009-10-04
  • 打赏
  • 举报
回复
学习了~
myscy8202 2009-10-03
  • 打赏
  • 举报
回复
很好
lilyhappyday 2009-10-03
  • 打赏
  • 举报
回复
如果改为对两个表进行操作,如下

表a: 表b:
班级 姓名 科目 成绩 班级 姓名 分数
(1)班 小明 语文 85 (1)班 小明 90
(1)班 小明 数学 90 (1)班 小兰 86
(1)班 小明 英语 82 (1)班 小欢 80
(1)班 小兰 语文 83 (2)班 小花 82
(1)班 小兰 数学 95
(1)班 小兰 英语 85
(1)班 小欢 语文 86
(1)班 小欢 数学 91
(1)班 小欢 英语 86
(2)班 小花 语文 87
(2)班 小花 数学 89

1.用sql语句把表a中(1)班的各科成绩都大于83的学生的三科总成绩的平均分乘以60%,再加上表b中对应学生的分数的40%,最后按所得的值从高到底排列。应该如何写sql语句?
(公式为:表a的三科平均分×60%+表b的分数×40%)

2.用sql语句把表a中(1)班的各科成绩都大于83的学生的语文和英语的平均分乘以60%,再加上表b中对应学生的分数的40%,最后按所得的值从高到底排列。应该如何写sql语句?
(公式为:表b的语文和英语的平均分×60%+表b的分数×40%)
lilyhappyday 2009-10-03
  • 打赏
  • 举报
回复
原来加上“group by 姓名”就行了。

select * from(
select 姓名,avg(成绩) as 平均成绩
from 表名 k
where 班级='(1)班'
and not exists(select * from 表名 where k.班级=班级 and k.姓名=姓名 and 成绩<=83 ) group by 姓名) k
order by 平均成绩 desc
lilyhappyday 2009-10-03
  • 打赏
  • 举报
回复
feixianxxx :

你写的语句在执行时出现了以下错误:

消息 8120,级别 16,状态 1,第 1 行
选择列表中的列 '表名.姓名' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

请问应该如何改?
feixianxxx 2009-10-03
  • 打赏
  • 举报
回复
--1.用sql语句把(1)班的各科成绩都大于83的学生按三科总成绩的平均分由高到低排列,应该如何写sql语句?
select * from(
select 姓名,avg(成绩) as 平均成绩
from 表名 k
where 班级='(1)班'
and not exists(select * from 表名 where k.班级=班级 and k.姓名=姓名 and 成绩<=83 )) k
order by 平均成绩 desc
--用sql语句把(1)班的各科成绩都大于83的学生按语文和英语两科成绩的平均分由高到低排列,应该如何写sql语句?
select 姓名,
平均成绩=AVG(成绩)
from(
select 姓名,成绩
from 表名 k
where 班级='(1)班'
and not exists(select * from 表名 where k.班级=班级 and k.姓名=姓名 and 成绩<=83 )) k\
where 科目='语文' or 科目='和英语'
order by 平均成绩 desc
ks_reny 2009-10-03
  • 打赏
  • 举报
回复
row_number()函数
lilyhappyday 2009-10-03
  • 打赏
  • 举报
回复
如果数据表加多一个英语成绩,变成有三个成绩,改为:

有一个数据表,格式如下:

班级 姓名 科目 成绩
(1)班 小明 语文 85
(1)班 小明 数学 90
(1)班 小明 英语 82
(1)班 小兰 语文 83
(1)班 小兰 数学 95
(1)班 小兰 英语 85
(1)班 小欢 语文 86
(1)班 小欢 数学 91
(1)班 小欢 英语 86
(2)班 小花 语文 87
(2)班 小花 数学 89

现在要求如下:

1.用sql语句把(1)班的各科成绩都大于83的学生按三科总成绩的平均分由高到低排列,应该如何写sql语句?

2.用sql语句把(1)班的各科成绩都大于83的学生按语文和英语两科成绩的平均分由高到低排列,应该如何写sql语句?

navy887 2009-10-03
  • 打赏
  • 举报
回复
小梁的OK
liangCK 2009-10-03
  • 打赏
  • 举报
回复
select 姓名,avg(成绩) as 平均分 from tb
where 班级='1班' group by 姓名;

select top 2 姓名,avg(成绩) as 平均分 from tb
where 班级 = '1班'
group by 姓名
order by avg(成绩) desc;

select 姓名 from tb
where 班级 = '1班'
group by 姓名
having count(case when 成绩 > 85 then 1 end) = count(*);

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧