PDA

Просмотр полной версии : Вопрос по MS SQL


Платон
07.10.2010, 22:52
Есть 2 таблицы students(id,name) и results (id,subject,mark)
Нужен запрос, который выведет список студентов с максимальным средним баллом. :help:

Little Squirrel
07.10.2010, 23:15
Во второй таблице id является идентификатором строки или идентификатором студента, к которому данная строка относится?

Платон
07.10.2010, 23:35
Во второй таблице id является идентификатором строки или идентификатором студента, к которому данная строка относится?

идентификатором студента,т.е. по нему связаны эти таблицы

Hubbitus
08.10.2010, 15:41
Полагаю вв results уже средние оценки? Сколько студентов надо (добавьте в запрос после select с нужным количеством TOP N)?
SELECT * FROM students s JOIN results r ON (s.id = r.id)

Помоему все просто элементарно. Если это не то что нужно, описываете трудности, с которыми столкнулись, подробнее.

Платон
08.10.2010, 16:14
Полагаю вв results уже средние оценки? Сколько студентов надо (добавьте в запрос после select с нужным количеством TOP N)?
SELECT * FROM students s JOIN results r ON (s.id = r.id)

Помоему все просто элементарно. Если это не то что нужно, описываете трудности, с которыми столкнулись, подробнее.

нет в results находятся все отметки по всем предметам, - средний бал нужно найти!
а в самом результате вывести имена студентов только с максимальными средними баллами.
т.е. нужно написать подзапрос, который простой для не новичков, но я затрудняюсь

Hubbitus
08.10.2010, 17:30
нет в results находятся все отметки по всем предметам, - средний бал нужно найти!

Тогда нужно агрегатный AVG с группировкой.

а в самом результате вывести имена студентов только с максимальными средними баллами.

То есть только один максимум, или, если есть такие же?
Думаю как-то так тогда:
SELECT TOP 1 WITH TIES name, AVG(mark) as avg_mark FROM students s JOIN results r ON (s.id = r.id) GROUP BY s.id

Платон
08.10.2010, 17:43
Тогда нужно агрегатный AVG с группировкой.

То есть только один максимум, или, если есть такие же?
Есть такие же,- вот в чём вся проблема для меня

Думаю как-то так тогда:
SELECT TOP 1 WITH TIES name, AVG(mark) as avg_mark FROM students s JOIN results r ON (s.id = r.id) GROUP BY s.id

Так, только средние баллы получаем, и это всё понятно. Вообщем, не знаю как подзапрос сделать в котором должен быть вот этот самый код.:idontnow:

Hubbitus
08.10.2010, 17:50
Так, только средние баллы получаем, и это всё понятно.
Ну так Вам только средние и имя и надо же. Впрочем Вы правы, сортировку я забыл добавить:
SELECT TOP 1 WITH TIES name, AVG(mark) as avg_mark FROM students s JOIN results r ON (s.id = r.id) GROUP BY s.id ORDER BY avg_mark DESC

Платон
08.10.2010, 18:07
Ну так Вам только средние и имя и надо же.


мне надо макимальные средние и имя;
ведь среди средних баллов для разных студентов, могут быть и тройки и четверки - нужно выбрать с максимальными баллами т.е. с пятерками или четверками если пятерок нет....

Hubbitus
08.10.2010, 19:02
Так запрос и выберет именно:
макимальные средние и имя
AVG посчитает среднее, ORDER BY avg_mark DESC упорядочит так чтобы максимальные были сверху, TOP 1 вернет только один верхний результат, WITH TIES остальные результаты с таким же значением. Вроде именно то что Вы хотели.

Платон
08.10.2010, 19:14
Так запрос и выберет именно:

AVG посчитает среднее, ORDER BY avg_mark DESC упорядочит так чтобы максимальные были сверху, TOP 1 вернет только один верхний результат, WITH TIES остальные результаты с таким же значением. Вроде именно то что Вы хотели.

аааа, спасибо, совершенно не знаю синтакиса, поэтому сразу не понял, что WITH TIES СВЯЗЫВАЕТ ИМЕНА.
Теперь всё понятно.:yees:

Hubbitus
08.10.2010, 20:36
поэтому сразу не понял, что WITH TIES СВЯЗЫВАЕТ ИМЕНА.
WITH TIES ничего не связывает совершенно! Не очень понял о чем Вы, но единственное что здесь связывает таблицы это JOIN. Все остальное что делает подробно расписал выше в посте.