【问题标题】:Query-ing data to get average grade查询数据得到平均成绩
【发布时间】:2019-05-14 12:27:51
【问题描述】:

我试图通过查询不同表中的数据来获得平均成绩,虽然看起来一切都如预期的那样,但查询不起作用。表格如下:

grade(id_grade, id_subject, student_code and grade)
student(student_code, first_name, last_name, birthdate, average_grade)
subject(id_subject, credits, subject_code, name, teacher)

平均成绩使用以下公式计算:(所有匹配成绩的总和(对应于学生中的学生代码)* 学生表的平均成绩 + 学科的学分 * 最新添加的成绩)/(所有匹配成绩的总和 +学分)。

查询如下:

UPDATE student AS s
SET 
    average_grade = ( 
        (SUM(g.grade) * s.average_grade + sub.credits * g.grade) / 
        (SUM(g.grade) + sub.credits) )
FROM grade AS g, subject AS sub
WHERE s.student_code = g.student_code AND 
    g.id_subject = sub.id_subject AND s.student_code = 141837;

请记住,这是 PostgreSQL,因此某些输入可能与其他 SQL-s 不同,但这是我能想到的。 我也尝试了以下方法,但也没有产生任何结果:

UPDATE student AS s 
LEFT JOIN grade AS g ON (s.student_code = g.student_code) 
LEFT JOIN subject AS sub ON (g.id_subject = sub.id_subject) 
SET average_grade = (
    (SUM(g.grade) * s.average_grade + sub.credits * g.grade) / 
    (SUM(g.grade) + sub.credits)) 
WHERE s.student_code = 141837;

非常感谢任何帮助!

【问题讨论】:

  • 请提供样本数据、所需结果以及平均计算的说明。

标签: sql postgresql


【解决方案1】:

您需要聚合为一个子查询。我认为平均计算不正确;我想你想要更多这样的东西:

UPDATE student s
    SET average_grade = g.average_grade
FROM (SELECT g.student_code,
             SUM(g.grade * s.credits) / SUM(s.credits) as average_grade
      FROM grade g JOIN
           subject s
           ON g.id_subject = s.id_subject
      GROUP BY g.student_code
     ) g
WHERE s.student_code = g.student_code AND
      s.student_code = 141837;

【讨论】:

  • 嘿;我忘了提到平均成绩的计算方式不同,因为不同的成绩有不同的学分。因此,虽然您的代码可能是正确的,但不幸的是,这不是我想要做的:/
  • @Frode 。 .这计算加权平均值。我想不出更合理的方法来计算有用的东西。
  • 我很抱歉,你是对的。我的错,我真的很感激它
猜你喜欢
  • 1970-01-01
  • 2019-08-25
  • 2017-06-10
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多