Просмотр полной версии : Вопрос по MS SQL
Есть 2 таблицы students(id,name) и results (id,subject,mark)
Нужен запрос, который выведет список студентов с максимальным средним баллом. :help:
Little Squirrel
07.10.2010, 23:15
Во второй таблице id является идентификатором строки или идентификатором студента, к которому данная строка относится?
Во второй таблице id является идентификатором строки или идентификатором студента, к которому данная строка относится?
идентификатором студента,т.е. по нему связаны эти таблицы
Hubbitus
08.10.2010, 15:41
Полагаю вв results уже средние оценки? Сколько студентов надо (добавьте в запрос после select с нужным количеством TOP N)?
SELECT * FROM students s JOIN results r ON (s.id = r.id)
Помоему все просто элементарно. Если это не то что нужно, описываете трудности, с которыми столкнулись, подробнее.
Полагаю вв 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
Тогда нужно агрегатный 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
Ну так Вам только средние и имя и надо же.
мне надо макимальные средние и имя;
ведь среди средних баллов для разных студентов, могут быть и тройки и четверки - нужно выбрать с максимальными баллами т.е. с пятерками или четверками если пятерок нет....
Hubbitus
08.10.2010, 19:02
Так запрос и выберет именно:
макимальные средние и имя
AVG посчитает среднее, ORDER BY avg_mark DESC упорядочит так чтобы максимальные были сверху, TOP 1 вернет только один верхний результат, WITH TIES остальные результаты с таким же значением. Вроде именно то что Вы хотели.
Так запрос и выберет именно:
AVG посчитает среднее, ORDER BY avg_mark DESC упорядочит так чтобы максимальные были сверху, TOP 1 вернет только один верхний результат, WITH TIES остальные результаты с таким же значением. Вроде именно то что Вы хотели.
аааа, спасибо, совершенно не знаю синтакиса, поэтому сразу не понял, что WITH TIES СВЯЗЫВАЕТ ИМЕНА.
Теперь всё понятно.:yees:
Hubbitus
08.10.2010, 20:36
поэтому сразу не понял, что WITH TIES СВЯЗЫВАЕТ ИМЕНА.
WITH TIES ничего не связывает совершенно! Не очень понял о чем Вы, но единственное что здесь связывает таблицы это JOIN. Все остальное что делает подробно расписал выше в посте.
vBulletin® v3.8.5, Copyright ©2000-2024, Jelsoft Enterprises Ltd.