编写sql查询,查询“计算机科学”系最年轻学生的姓名以及他(他们)获得的总分。”

编写sql查询,查询“计算机科学”系最年轻学生的姓名以及他(他们)获得的总分。”,sql,oracle,join,sum,Sql,Oracle,Join,Sum,我得到了一个学生数据表,我必须为以下内容编写查询: 检索“计算机科学”系最年轻学生的姓名 连同他所获得的所有科目的总分,他们都被录取了 数据库架构如下所示: depts( deptcode char(3) primary key, deptname char(70) not null); 我把这个查询写成 select s.name, s.bdate, sum(c.marks) as marks from students s inner join crs_regd c on s.rollno

我得到了一个学生数据表,我必须为以下内容编写查询:

检索“计算机科学”系最年轻学生的姓名 连同他所获得的所有科目的总分,他们都被录取了

数据库架构如下所示:

depts(
deptcode char(3) primary key,
deptname char(70) not null);
我把这个查询写成

select s.name, s.bdate, sum(c.marks) as marks from students s
inner join crs_regd c
on s.rollno=c.crs_rollno
inner join (
select st.name, min(st.bdate) as bdate from students st, depts d
where st.deptcode=d.deptcode and d.deptname='Computer Science and Technology' group by st.name) x
on x.name=s.name and x.bdate=s.bdate group by s.name,s.bdate;
获得的输出为:

JOSH MARTIN                                14-JUN-99         274
GARY LEWIS                                 30-JUN-99         90
SUSANE SHAW                                26-JAN-99         185
如果每栏代表在不同学科中获得的分数,则所有分数都属于“计算机科学”系

预期产量

SUSANE SHAW                                26-JAN-99         185
我在哪里出错?如果我错了,请告知。如果需要任何其他信息,请在下面发表评论。如果有其他方法编写此查询,请讨论。

您可以在下面尝试-

select s.name, s.bdate, sum(c.marks) as marks from students s
inner join crs_regd c on s.rollno=c.crs_rollno
where s.bdate in 
(select min(st.bdate) as bdate from students st inner join depts d
on st.deptcode=d.deptcode and d.deptname='Computer Science and Technology')
group by s.name, s.bdate;
你可以在下面试试-

select s.name, s.bdate, sum(c.marks) as marks from students s
inner join crs_regd c on s.rollno=c.crs_rollno
where s.bdate in 
(select min(st.bdate) as bdate from students st inner join depts d
on st.deptcode=d.deptcode and d.deptname='Computer Science and Technology')
group by s.name, s.bdate;
子查询中的分组依据错误。 编辑:由于我同意join usage注释,我重写了查询

选择s.name、s.bdate、SUMc.marks作为标记 来自学生的 s.rollno=c.crs\U rollno上的内部连接crs\U regd c 内连接 选择MINst.bdate作为bdate 来自学生街 st.deptcode=d.deptcode上的内部联接部门d 其中d.deptname='Computer Science and Technology' x.bdate上的x=s.bdate 按s.name、s.bdate分组; 您编写的子查询返回每个学生的最小出生日期,而不是整个系的最小出生日期

子查询中的分组依据错误。 编辑:由于我同意join usage注释,我重写了查询

选择s.name、s.bdate、SUMc.marks作为标记 来自学生的 s.rollno=c.crs\U rollno上的内部连接crs\U regd c 内连接 选择MINst.bdate作为bdate 来自学生街 st.deptcode=d.deptcode上的内部联接部门d 其中d.deptname='Computer Science and Technology' x.bdate上的x=s.bdate 按s.name、s.bdate分组;
您编写的子查询返回每个学生的最小出生日期,而不是整个系的最小出生日期

如果GARY LEWIS的bdate与SUSANE SHAW相同,那么预期结果是什么?@jarlh在这种情况下,两个记录都应该显示。我想您需要按bdate ASC订购,并设置限制1。@Fredrikstigson,将只返回1个我们er即使有多个用户具有相同的最新bday。切换到modern FETCH FIRST 1 ROW with TIES以获取所有用户。请在代码问题中给出一个-cut&paste&runnable code;示例输入,作为表格初始化代码,具有所需和实际输出,包括逐字错误消息;标记和版本;清晰的规范和解释。Th至少包含您能给出的代码,即您显示的代码是正确的,扩展为您显示的代码是不正确的。调试基础。PS将您的问题集中在该错误上,如果您仍然被卡住,请稍后在新帖子中重新问您的总体目标。如果GARY LEWIS的bdate与SUSANE SHAW相同,那么预期结果是什么?@jarlh在这种情况下,两个应显示记录。我认为您需要按bdate ASC订购,并设置限制1。@FredrikStigsson,即使有多个用户具有相同的最新bday,也只返回1个用户。切换到modern FETCH FIRST 1 ROW with TIES以获取所有记录。请在代码问题中给出一个-cut&paste&runnable code;示例输入作为表格初始化代码具有所需的和实际的输出,包括逐字记录错误消息;标记和版本;清晰的规范和解释。这包括您可以提供的最少代码,即您显示的代码是OK的,由您显示的代码扩展为不OK的代码。调试基础。PS将您的问题集中在该错误上,并在稍后的新帖子中询问您的总体目标,如果您e仍然卡住。这里缺少group by子句以实现sumc.MARK这里缺少group by子句以实现今天的sumc.marksTip:始终使用现代的显式连接语法。更容易编写而不出错,更容易阅读和维护,并且更容易在需要时转换为外部连接。今天的IP:始终使用现代的显式连接语法x、 更易于编写而无错误,更易于读取和维护,并且在需要时更易于转换为外部联接
select s.name, s.bdate, sum(c.marks) as marks from students s
inner join crs_regd c on s.rollno=c.crs_rollno
where s.bdate in 
(select min(st.bdate) as bdate from students st inner join depts d
on st.deptcode=d.deptcode and d.deptname='Computer Science and Technology')
group by s.name, s.bdate;