Вы совершенно правы, в том подзапросе закралась ошибочка, он должен быть таким же как и первый. Ведь идея заключается вот в чем, получаем множество студентов со средними значениями по кафедрам и получаем множество студентов с максимальными значениями по кафедрам, на основе первого запроса,. И из первого множества выбираем только те что входят во второе. Тем самым показывая 'злощастных' студентов.
В oracle это работает:
Код:
SQL> select k.kafedra, k.student, k.avgrade
2 from (
3 select G.K kafedra, S.SNAME student, AVG(E.GRADE) avgrade
4 from G join S on G.NG=S.GN join E on S.S=E.S
5 group by G.K, S.SNAME) k
6 where (k.kafedra, k.avgrade) in (
7 select m.kafedra, MAX(m.avgrade)
8 from (
9 select G.K kafedra, AVG(E.GRADE) avgrade
10 from G join S on G.NG=S.GN join E on S.S=E.S
11 group by G.K, S.SNAME) m
12 group by m.kafedra
13 );
KAFEDRA STUDENT AVGRADE
-------------------- ---------- ----------
kat1 Petrov 7
kat2 Vasin 7
SQL> select G.K kafedra, S.SNAME student, AVG(E.GRADE) avgrade
2 from G join S on G.NG=S.GN join E on S.S=E.S
3 group by G.K, S.SNAME;
KAFEDRA STUDENT AVGRADE
-------------------- ---------- ----------
kat1 Ivanov 5.33333333
kat1 Petrov 7
kat1 Pupkin 5
kat1 Sidorov 4.83333333
kat2 Lenin 6.33333333
kat2 Mishin 6
kat2 Popov 5.66666667
kat2 Vasin 7
8 rows selected.
SQL> select G.K kafedra, AVG(E.GRADE) avgrade
2 from G join S on G.NG=S.GN join E on S.S=E.S
3 group by G.K, S.SNAME;
KAFEDRA AVGRADE
-------------------- ----------
kat1 5.33333333
kat1 7
kat1 5
kat1 4.83333333
kat2 6.33333333
kat2 6
kat2 5.66666667
kat2 7
8 rows selected.
SQL> select m.kafedra, MAX(m.avgrade)
2 from (
3 select G.K kafedra, AVG(E.GRADE) avgrade
4 from G join S on G.NG=S.GN join E on S.S=E.S
5 group by G.K, S.SNAME) m
6 group by m.kafedra;
KAFEDRA MAX(M.AVGRADE)
-------------------- --------------
kat1 7
kat2 7
Похоже что в Accesse Inline View не работают.