Как рассчитать средний балл в MySql - PullRequest
1 голос
/ 25 мая 2019

В запросе должны быть указаны имя студента и средний балл.

Даны следующие таблицы:

раздел:

CREATE TABLE `Section` (
  `ID` int(11) NOT NULL,
  `Semester` varchar(45) DEFAULT NULL,
  `Room` varchar(45) DEFAULT NULL,
  `Instructor_ID` int(11) NOT NULL,
  `Course_ID` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `fk_Section_Instructor_idx` (`Instructor_ID`),
  KEY `fk_Section_Course1_idx` (`Course_ID`),
  CONSTRAINT `fk_Section_Course1` FOREIGN KEY (`Course_ID`) REFERENCES `Course` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_Section_Instructor` FOREIGN KEY (`Instructor_ID`) REFERENCES `Instructor` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `Section` VALUES (1,'Fa17','828',1,1),(2,'Fa17','828',2,3),(3,'Fa17','829',1,4),(4,'Fa17','829',4,5),(5,'Sp18','828',1,1),(6,'Sp18','829',1,2),(7,'Sp18','828',3,4),(8,'Sp18','828',4,5);

курс:

DROP TABLE IF EXISTS `Course`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Course` (
  `ID` int(11) NOT NULL,
  `Title` varchar(45) DEFAULT NULL,
  `Description` text,
  `Units` int(11) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Course` VALUES (1,'CIS-15','Cloud Programming in Python',4),(2,'CIS-54','Relational Databases',4),(3,'CIS-81','Introduction to Networking',4),(4,'CIS-75','Introduction to Computer Security',3),(5,'CIS-90','Introduction to Linux',3);

регистрация:

 CREATE TABLE `Registration` (
  `Section_ID` int(11) NOT NULL,
  `Student_ID` int(11) NOT NULL,
  `Grade` int(11) DEFAULT NULL,
  PRIMARY KEY (`Section_ID`,`Student_ID`),
  KEY `fk_Section_has_Student_Student1_idx` (`Student_ID`),
  KEY `fk_Section_has_Student_Section1_idx` (`Section_ID`),
  CONSTRAINT `fk_Section_has_Student_Section1` FOREIGN KEY (`Section_ID`) REFERENCES `Section` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_Section_has_Student_Student1` FOREIGN KEY (`Student_ID`) REFERENCES `Student` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Registration` VALUES (1,1,4),(1,2,4),(2,2,3),(3,3,2),(4,1,3),(4,3,3),(5,3,NULL),(5,4,NULL),(6,1,NULL),(6,2,NULL),(7,1,NULL),(7,4,NULL),(8,2,NULL),(8,3,NULL);

студент:

CREATE TABLE `Student` (
  `ID` int(11) NOT NULL,
  `Name` varchar(45) DEFAULT NULL,
  `Email` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Student` VALUES (1,'Steve Inskeep','steve@xyz.edu'),(2,'Rene Montaign','rene@xyz.edu'),(3,'David Green','david@xyz.edu'),(4,'Rachel Martin','rachel@xyz.edu');

Я попробовал этот код, попробовал это и получил бессмысленный вывод.Я довольно растерян

SELECT student.Name, (sum( registration.grade * course.units) /
    sum(course.units)
   ) as GPA FROM registration 

   join student on registration.student_ID = student.id join section on  section.ID = registration.section_ID
   join course on section.course_ID = course.ID
   group by registration.student_ID  ;

ГПД кажется неправильным, потому что enter image description here

Возвращенный результат по предложению @Barbaros Özhan, а также по аналогичным решенияммое собственное:

'1', 'Steve Inskeep', '1.7857'

в качестве первого возвращенного ряда.

, но, очевидно, из-за того, что вы смотрите на регистрационную таблицу Student # 1не имеет 1.7857 ГПД.

Редактировать: Ответ Гордона Линоффа:

 select student.Name,
       (sum( registration.grade * course.units) /
        sum( case when registration.grade is not null then course.units end )
       ) as GPA
from registration  join 
     student 
     on registration.student_ID = student.id join
     section 
     on section.ID = registration.section_ID join
     course 
     on section.course_ID = course.ID
group by student.ID  ;

Ответы [ 4 ]

1 голос
/ 25 мая 2019

Проблема в том, что у вас NULL оценки.,,но вы считаете части, поэтому они рассматриваются как нули.

Небольшая корректировка вашего расчета исправит это:

select s.Name,
       (sum( r.grade * c.units) /
        sum( case when r.grade is not null then c.units end )
       ) as GPA
from registration r join 
     student s
     on r.student_ID = s.id join
     section se
     on se.ID = r.section_ID join
     course c
     on se.course_ID = c.ID
group by s.student_ID  ;
1 голос
/ 25 мая 2019

Вы можете присоединиться к своим столам, как показано ниже:

select s.ID, s.Name,  
       sum( r.grade * c.Units ) / sum(c.Units) as GPA
  from student s
  left join registration r on r.Student_ID = s.ID
  left join section sc on sc.ID = r.Section_ID
  left join course c on c.ID = sc.Course_ID 
 group by s.ID, s.Name 

Демо

1 голос
/ 25 мая 2019

Учитывая, что учащийся получает оценку по разделу, я не думаю, что вам нужны таблицы Section и Course в вашем запросе (хотя, не видя пример данных, трудно быть уверенным).Это должно работать:

SELECT s.Name, COALESCE(SUM(r.Grade) / COUNT(r.Grade), 0) AS GPA
FROM student s
JOIN registration r ON r.Student_ID = s.ID
GROUP BY s.Name

Вывод

Name            GPA
David Green     2.5
Rachel Martin   0
Rene Montaign   3.5
Steve Inskeep   3.5

Демонстрация на dbfiddle

Если вам необходимо оценивать оценки в соответствии с единицами курса, товам нужно сложить умножение оценки на единицы и затем разделить на сумму единиц, соблюдая только сумму единиц курса, где есть действительная оценка:

SELECT s.Name, 
       ROUND(COALESCE(SUM(r.Grade * c.Units) / SUM(CASE WHEN r.Grade IS NOT NULL THEN c.Units ELSE 0 END), 0), 2) AS GPA
FROM Student s
JOIN Registration r ON r.Student_ID = s.ID
JOIN Section x ON x.ID = r.Section_ID
JOIN Course c ON c.ID = x.Course_ID
GROUP BY s.Name;

Вывод:

Name            GPA
David Green     2.5
Rachel Martin   0
Rene Montaign   3.5
Steve Inskeep   3.57

Демонстрация на dbfiddle

0 голосов
/ 25 мая 2019

Вы присоединяетесь к идентификатору студента из регистрационной таблицы, но вы не выбрали его из регистрационной таблицы, чтобы присоединиться к нему.Попробуйте добавить идентификатор учащегося к выбору из таблицы регистрации.

Затем вы присоединяете таблицу курса к таблице разделов, но таблица разделов еще не была присоединена.Недопустимая операция. Прежде чем вы сможете присоединиться к разделу к курсу, вам необходимо сначала присоединиться к разделу.

Могут быть и другие проблемы, но начните с этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...