SQLite AVG () возвращает тот же результат, что и строка - PullRequest
0 голосов
/ 23 июня 2018

При использовании AVG() для определения средней оценки учащегося я заметил, что мой результат совпадает с вводом для строки.

Например:

AVG() result

на изображении выше, у Джеффа есть 83 и 85 для термина 2 и 3, но его avg_mark не является единственной строкой, которая говорит 83.5

Мой запрос выглядит следующим образом:

Select m.stdName, m.markPercent, m.crsName, m.term, AVG(distinct markPercent)  as avg_mark 
from Marks as m 
inner join StudentSchedule as ss on ss.crsName = m.crsName and ss.stdName = m.stdName
Inner JOIn Course as c on c.crsName = m.crsName
where m.stdName like 'Jeff'
group by m.stdName, m.markPercent, m.crsName, m.term;

Некоторые таблицы из моей схемы:

create table Course (
  crsID INTEGER PRIMARY KEY  AUTOINCREMENT,
  crsName VARCHAR(8) NOT NULL,
  crsTerm INT NOT NULL
);

CREATE TABLE StudentSchedule(
  stdSchedule INTEGER PRIMARY KEY  AUTOINCREMENT,
  stdName INT NOT NULL,
  teacherName INT not NULL,
  crsName INT not NULL,
  startTime NUMERIC NOT NULL,
  endTime NUMERIC NOT NULL,
  term INT NOT NULL,
  FOREIGN KEY(stdName) references Student(stdID),
  FOREIGN KEY(teacherName) REFERENCES Teacher(teacherID),
  FOREIGN KEY(crsName) REFERENCES Course(crsID)
);

CREATE TABLE Marks (
  markID  INTEGER PRIMARY KEY AUTOINCREMENT,
  markPercent REAL NOT NULL,
  stdName INT NOT NULL,
  crsName INT not NULL,
  term INT NOT NULL,
  FOREIGN KEY(stdName) references Student(stdID),
  FOREIGN KEY(crsName) REFERENCES Course(crsID),
  FOREIGN KEY(term) references StudentSchedule(term)
);

insert into Course (crsName, crsTerm) values ('COMP4900', 2);

insert into StudentSchedule(stdName, teacherName, crsName, startTime, endTime, term) values ('Jeff','tej','COMP4900',1000,1200,2);
insert into StudentSchedule(stdName, teacherName, crsName, startTime, endTime, term) values ('Jeff','farnaz','COMP4900',1200,200,3);

insert into Marks (markPercent, stdName, crsName, term) values (83.0, 'Jeff','COMP4900', 2);
insert into Marks (markPercent, stdName, crsName, term) values (87.0, 'Jeff','COMP4900', 3);

Может ли кто-нибудь указать на ошибку в моем запросе?

1 Ответ

0 голосов
/ 23 июня 2018

Данные немного сбивают с толку, потому что stdName и crsName являются целыми числами, но ваши INSERT помещают в них строки (что, к сожалению, SQLite позволяет вам обойтись).

За исключением основной проблемыэто то, что вы группируете по m.markPercent и нескольким другим вещам, поэтому в итоге вы применяете функцию агрегирования к одной строке за раз.Есть также странный AVG(distinct markPercent), который не имеет особого смысла, проблема GROUP BY скрывает эту проблему.

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

select stdName, avg(markPercent) avgMark
from Marks
group by stdName, crsName

Вы набираете среднее значение по каждому студенту, и это именно то, что это говорит.Используйте это в качестве производной таблицы и присоединитесь к ней:

select m.stdName, m.markPercent, m.crsName, m.term, a.avgMark
from Marks m
join (select stdName, avg(markPercent) avgMark from Marks group by stdName, crsName) a on m.stdName = a.stdName
where ...

Тогда, если stdName и crsName действительно являются целыми числами, которые ссылаются на другие таблицы, тогда больше объединений, чтобы получить нужные имена строк.

...