Показать сообщение отдельно
Старый 06.05.2005, 00:31     # 9
marine
Guest
 
Сообщения: n/a

Цитата:
Сообщение от obrp
А вот такие штучки а Accesse можно?

Код:
select k.kafedra, k.student, k.avgrade
from (                                                 
	select G.K kafedra, S.SNAME student, AVG(E.GRADE) avgrade
	from G join S on G.NG=S.GN join E on S.S=E.S             
  	group by  G.K, S.SNAME) k
where (k.kafedra, k.avgrade) in (
	select m.kafedra, MAX(m.avgrade)
	from (
		select G.K kafedra, AVG(E.GRADE) avgrade
		from G join S on G.NG=S.GN join E on S.S=E.S
		group by  G.K) m
	group by m.kafedra
	)

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

Теперь по первому примеру.
в первом подзапросе
Код:
select G.K kafedra, S.SNAME student, AVG(E.GRADE) avgrade
	from G join S on G.NG=S.GN join E on S.S=E.S             
  	group by  G.K, S.SNAME
фактически получаем средний бал каждого студента

в третьем подзапросе
Код:
select G.K kafedra, AVG(E.GRADE) avgrade
from G join S on G.NG=S.GN join E on S.S=E.S
group by  G.K
получаем средний бал по каждой кафедре т.е. средний бал всех студентов учащихся на данной кафедре. А сам запрос в котором вызывается третий подзапрос пытается найти кафедру с максимальным средним балом.
Т.о. имея средний бал каждого студента и средний бал по каждой кафедре нельзя найти на каждой кафедре студента с наибольшим средним балом.
А теперь почему запрос в котором вызывается третий подзапрос пытается найти кафедру с максимальным средним балом, я переделал запрос что бы Access его понял

Код:
SELECT k.kafedra, k.student, k.avgrade
FROM [SELECT Группа.Кафедра, Студент.Фамилия, Avg(Экзамен.Оценка) AS [Avg-Оценка]
FROM (Группа INNER JOIN Студент ON Группа.[Номер группы]=Студент.[Номер группы]) INNER JOIN Экзамен ON Студент.Идентификатор=Экзамен.[Идентификатор студента]
GROUP BY Группа.Кафедра, Студент.Фамилия
]. AS k
WHERE (k.kafedra, k.avgrade) in (
select m.kafedra, MAX(m.avgrade)
from (
SELECT Группа.Кафедра, Avg(Экзамен.Оценка) AS [Avg-Оценка]
FROM (Группа INNER JOIN Студент ON Группа.[Номер группы]=Студент.[Номер группы]) INNER JOIN Экзамен ON Студент.Идентификатор=Экзамен.[Идентификатор студента]
GROUP BY Группа.Кафедра) m
group by m.kafedra
);
и вот что он мне ответил:
Из подчиненного запроса, который не использует ключевое слово EXISTS в предложении FROM главного запроса, возвращается более одного поля. Укажите в инструкции SELECT подчиненного запроса возвращение только одного поля. (Ошибка 3306)
по моему это ошибка вот тут
Код:
MAX(m.avgrade)