【问题标题】:SQL query not returning expected values when summing total values in a column对列中的总值求和时 SQL 查询不返回预期值
【发布时间】:2020-09-19 17:56:48
【问题描述】:

我有这个架构:

  • Students (sid: int, firstName: str, lastName: str, yearStarted: int)

  • Majors (sid: int, major: str)
    注意:一个学生可能拥有多个专业。

  • Grades(sid:int,cid:int,学分:int,等级:int)
    注:sid,cid=外键,等级:A=4,B=3,C=2,D=1,F=0。

  • Courses(cid:int,编号:int,教授:str,专业:str,年份:int,学期:str) 注意: cid 在学期中是唯一的。学期是夏季、秋季或春季。如果两个课程的编号和专业相同,则它们是相同的

使用此架构,我需要“提供 SQL 查询,该查询将生成每个学生的名字、姓氏、yearStarted 和总学分。你不应该考虑成绩为 0 的课程,因为这些对应失败的课程”

到目前为止,我有这个:

def q4(self):
    query = '''
    select s.firstName, s.lastName, s.yearStarted,count(*)
    from students s, grades g
    where s.sid = g.sid
    and g.grade >0
    group by s.firstName, s.lastName, s.yearStarted
    '''
    self.cur.execute(query)
    all_rows = self.cur.fetchall()
    return all_rows

并返回这些值:

[('安妮', '布朗', 2020, 1), (“杰克”、“汤姆森”,2018 年,第 3 期), (“雅各布”,“麦卡锡”,2020 年,2), (“贾马尔”、“琼斯”,2019 年,第 3 期), ('简','Doe',2017,2), (“约翰”,“Doe”,2017 年,3), ('蒂姆','伯顿',2018,3), (“蒂娜”,“吉利根”,2019,3)]

但显然这些是错误的,当我上传到 Gradescope 时,它​​给了我这些错误,位于所附图片

任何想法我做错了什么?

【问题讨论】:

  • 您选择是否有理由使用正确、明确、标准、可读的JOIN语法?
  • 在我看来,你有所有的学生,但你有不同的顺序,练习是否指定了学生的顺序?
  • @GordonLinoff 不,没有。我已经使用了基于 sid 的内部连接,结果出现了正常的错误。
  • @GordonLinoff 这显然是个学生,也许要调低一点?
  • 不,必须不同的不是GROUP BY,而是ORDER BY。奇怪的是,他们没有在描述中说出他们想要的顺序,而是告诉你你的结果不匹配,只是因为它的顺序与他们预期的不同。

标签: python sql multiple-columns


【解决方案1】:

我已经找到答案了。感谢@ChristianSloper 帮助我

def q4(self):
    query = '''
    select s.firstName, s.lastName, s.yearStarted,count(*)  as cnt
    from students s, grades g
    where s.sid = g.sid
    and g.grade >0
    group by s.sid, s.yearStarted
    order by s.yearStarted
    desc
     
    '''
    self.cur.execute(query)
    all_rows = self.cur.fetchall()
    return all_rows

【讨论】:

  • 是的,似乎唯一缺少的是ORDER BY,但是,它不在您向我们展示的任务描述中。由于 firstname + lastname + yearstarted 在表中可能是唯一的,因此按这些或按 id 分组会得到相同的结果(按 id 分组时,GROUP BY 中的 yearstarted 是多余的)。您不应该使用逗号分隔的连接。在显式连接被发明之前,它们一直被使用——那是在 1992 年!如果你仍然被教这些,这会对你的课程、书籍或教程造成不好的影响。 (人们应该知道它们存在,但我们不再使用它们。)
  • 并确保始终使用正确、明确、标准、可读的JOIN 语法。
  • @Parfait 同意,我知道这不是最好的方法。从这里开始将使用显式连接。谢谢大家的建议!
猜你喜欢
  • 1970-01-01
  • 2019-06-10
  • 2020-06-28
  • 2014-11-03
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多