【问题标题】:Finding the average age of all students enrolled in each different class查找每个不同班级的所有学生的平均年龄
【发布时间】:2020-05-01 00:15:42
【问题描述】:

我无法弄清楚如何找到所有参加任何课程的学生的平均数,而不是找到每个班级的平均数。

这相当于找到每个确实有学生注册的班级,计算总和,计算平均值,然后转到下一个注册学生的班级。然后假设有三个班级有学生就读,让我们输出三个班级的平均年龄。应该返回三个结果,而不是一个。

我最初的想法是一个尝试性的解决方案

SELECT AVG(AGE) FROM STUDENTS;

下面列出了我使用的架构,主键以粗体突出显示。

  • 学生(sid:整数,姓名:字符串,专业:字符串,年龄:整数)

  • 注册(sid:整数cid:整数

  • 课程(cid:整数,名称:字符串,讲师:字符串,房间:字符串,时间:时间)

非常感谢任何帮助。

找出该班级所有学生的平均年龄。

样本数据 - 学生

INSERT INTO `Students` (`sid`, `name`, `major`, `age`) VALUES ('1', 'Raymond', 'CS', '20');
INSERT INTO `Students` (`sid`, `name`, `major`, `age`) VALUES ('2', 'Jack', 'CS', '22');
INSERT INTO `Students` (`sid`, `name`, `major`, `age`) VALUES ('3', 'Henry', 'CS', '21');

样本数据 - 注册

INSERT INTO `Enrollment` (`sid`, `cid`) VALUES ('1', '1');
INSERT INTO `Enrollment` (`sid`, `cid`) VALUES ('1', '2');
INSERT INTO `Enrollment` (`sid`, `cid`) VALUES ('2', '2');

示例数据 - 类

INSERT INTO `Classes` (`cid`, `name`, `instructor`, `room`, `time`) VALUES ('1', 'Math', 'Jack Brown', '300', '11:20:09');
INSERT INTO `Classes` (`cid`, `name`, `instructor`, `room`, `time`) VALUES ('2', 'Math', 'Henrita Espen', '500', '12:20:09');

数据库名称 - DB

预期输出 - 可以变化

如果只有同一个学生,按id分组会导致平均年龄相同。

20

【问题讨论】:

  • 请提供样本数据、所需结果和适当的数据库标签。
  • @GordonLinoff 谢谢,正在努力。
  • 参加 Henrita Espen 数学课的学生的平均年龄应该是 21 岁,不是吗?招收了两个学生:雷蒙德和杰克。因此,Raymond 的年龄 (20) 加上 Jack 的年龄 (22) 得出 42 和 42 除以 2(即班级学生人数)为 21。因此您的预期输出应该是:20 , 21
  • @Abra Student 1 20 岁就读 1 班,他也是唯一一个 20 岁就读 2 班的人。所以有两个 20 的结果。但是如果你按 id 分组是的,那么你是对的,一个结果就是平均值。

标签: sql


【解决方案1】:

类似这样的:

select avg(s.age), e.cid
from students s join enrollment e on s.sid = e.sid
group by e.cid

【讨论】:

  • 我明白你在说什么,我收到一个错误,涉及 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于非聚合列 'db.e.cid' GROUP BY 子句中的列。但我会看看这个并尝试让它发挥作用。
  • @unfairhistogram 我发现这是 select 和 group by 的 cid,我让它工作了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多