SQL - Рассчитать взвешенные оценки студентов на основе типа оценки - PullRequest
0 голосов
/ 12 марта 2019

У меня проблемы с вычислением оценок учеников на основе определенного типа оценок.

У меня есть следующие таблицы

Subject
-------------------
Subid [PK]
subjectTitle

Topic
----------------
Tid (TopicID) [PK]
SubId (Subjectid) [FK]
Designation
WeightOfSubject

Marking
-------------------
pid (PersonID) [PK][FK]
Tid (TopicID) [PK][FK]
Points

Person
------------------------
pid (PersonId) [PK]
firstname
lastname
Sex

В сочетании со следующими данными.

Subject Data

Subid

AA001       Arts
AA002       Crafts


Topic Data

Tid      Subid      Designation WeightOfSubject
001      AA001          S1        30    
002      AA001          S2        30    
003      AA001          S3        40
004      AA002          S1        50
005      AA002          S2        50


Marking DATA

Pid Tid Points(out of 100)
P01 001 33
P01 002 62
P01 003 81
P01 004 85
P01 005 63
P02 001 74
P02 002 72
P02 003 45
P02 004 63
P02 005 88


Person DATA

pid firstname   lastname    sex
P01 Josh        Draxler     M
P02 John        Doe         M   

То, что я хотел бы сделать с этим, это умножить отметки на их вес, а затем сложить все взвешенные оценки вместе, чтобы получить среднее общее взвешенное для каждого предмета, который они сделали (с окончательным результатом, отображающим идентификаторы предметов,человек, и его средневзвешенная оценка в процентах.)

Хотя мой MYSQL в лучшем случае посредственный, я попробовал и объяснил следующее (я знаю, что это неправильно с милей, не волнуйтесь.)

SELECT Topic.Designation, Subject.Subid, Subject.subjectTitle, Person.firstname, Person.lastname, AVG(Topic.WeightOfSubject/100*Marking.Points)
FROM Topic, Subject, Person, Marking
WHERE Person.pid = 'P01'
AND Marking.Points = 33
AND Topic.WeightOfSubject = 30

Это нормально только для одного человека, но я не уверен, как построить такой запрос для более чем одного человека и более чем одного субъекта. Я ищу в JOINS итакое, но это действительно не помогло мне в том, как я мог построить запрос для моей конкретной проблемы.Вот вывод, который я хотел бы ожидать:

Pid  Firstname  Lastname  subjectTitle  Result(WeightedAverage)
001  Josh       Draxler   Arts         (Weighted Average Here)  

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 12 марта 2019

Я локально (пере) создал таблицы в MySQL 8.0, как показано ниже:

create table subject (
  subid int,
  subjecttitle varchar(10)
);

create table topic (
  tid int,
  subid int,
  designation varchar(10),
  weightofsubject int
);

create table marking (
  pid int,
  tid int,
  points int
);

create table person (
  pid int,
  firstname varchar(20),
  lastname varchar(20),
  sex varchar(1)
);

Затем я запустил запрос, показанный ниже. Он производит средневзвешенное значение для каждого человека и предметов, которые он / она имеет:

select
  p.pid as pid,
  max(p.firstname) as firstname,
  max(p.lastname) as lastname,
  max(p.sex) as sex,
  s.subid, -- you can remove this column, if you wish
  max(s.subjecttitle) as subjecttitle,
  1.0 * sum(m.points * t.weightofsubject) /
    sum(t.weightofsubject) as weighted_average
from subject s
join topic t on t.subid = s.subid
join marking m on m.tid = t.tid
join person p on p.pid = m.pid
group by p.pid, s.subid
order by p.pid, s.subid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...