Показать сообщение отдельно
Старый 05.05.2005, 12:59     # 6
marine
Guest
 
Сообщения: n/a

[QUOTE=Ghost]Вот до чего дошел я:[CODE]
SELECT s.stud_id stud_id, cath_id, avgm FROM student s,
Цитата:
Сообщение от Ghost
Вот до чего дошел я:
Код:
SELECT s.stud_id stud_id, cath_id, avgm FROM student s,
(SELECT stud_id, AVG(mark) avgm FROM exam_marks GROUP BY stud_id) a
WHERE s.stud_id = a.stud_id;
При этом получается таблица из трех полей: номер группы (cath_id), идентификатор студента (stud_id) и его средний балл (avgm). В принципе можно найти MAX(avgm), сгруппировав по полю cath_id, но при этом теряется поле stud_id - выбирать можно только те поля, которые переписаны в GROUP BY или являются аргументами агрегирующих функций; если же в GROUP BY добавить и это поле (т.е. группировать по cath_id и stud_id), то смысл поиска MAX теряется - строки группируются по одной (очевидно - не может быть двух строк с одинаковыми обоими полями и stud_id, и cath_id). Надо еще подумать... Но, может, дальше и сам до чего-недь додумаешься?...

З.Ы. Кстати, на чем пишешь? Если на Oracle (как и я), то может стоит заколбасить процедурку на PL/SQL?
К сожалению вынужден писать на Access-e .
Может я что-то недопонял, но по моему то что ты написал чуть-чуть не то т.к. необходимо найти на каждой кафедре студента с наибольшим средним балом, то отсюда следует, что надо группировать именно по полю имя кафедры а не по каким либо другим, потому что на одной кафедре могут быть (и есть) разные группы, а уже потом в каждой группу выбирать максимальный средний бал.
Если бы можно делать вложенный агрегатные запросы, то это выглядело наверно так :



Код:
SELECT Группа.Кафедра, Студент.Фамилия, Max(Avg(Экзамен.Оценка) AS [Avg-Оценка])
FROM (Группа INNER JOIN Студент ON Группа.[Номер группы]=Студент.[Номер группы]) INNER JOIN Экзамен ON Студент.Идентификатор=Экзамен.[Идентификатор студента]
GROUP BY Группа.Кафедра;
но, как я уже говорил, так делать незя.
Я пытался делать с вложенными запросами :

Код:
SELECT Группа.Кафедра, Студент.Фамилия, Avg(Экзамен.Оценка) AS [Avg-Оценка]
FROM (Группа INNER JOIN Студент ON Группа.[Номер группы]=Студент.[Номер группы]) INNER JOIN Экзамен ON Студент.Идентификатор=Экзамен.[Идентификатор студента]
GROUP BY Группа.Кафедра, Студент.Фамилия
HAVING Max  ( 
                        SELECT Avg(Экзамен.Оценка) AS [Avg-Оценка] FROM (Группа INNER JOIN Студент ON Группа.[Номер группы]=Студент.[Номер группы]) INNER JOIN Экзамен ON Студент.Идентификатор=Экзамен.[Идентификатор студента]
GROUP BY Группа.Кафедра
                      );
в этом примере есть неточности и неувязки(ни хочу говорить об них т.к. к делу не относиться), просто я хотел показать что я надумал, но в принципе налицо такой же вложенный агрегатный запрос.

Так что я все сижу и думаю как сделать эту хрень......