IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Вопрос по MS SQL (http://www.imho.ws/showthread.php?t=144597)

Платон 07.10.2010 22:52

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

Little Squirrel 07.10.2010 23:15

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

Платон 07.10.2010 23:35

Цитата:

Сообщение от Little Squirrel (Сообщение 1725046)
Во второй таблице 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

Цитата:

Сообщение от Hubbitus (Сообщение 1725114)
Полагаю вв results уже средние оценки? Сколько студентов надо (добавьте в запрос после select с нужным количеством TOP N)?
Код:

SELECT * FROM students s JOIN results r ON (s.id = r.id)
Помоему все просто элементарно. Если это не то что нужно, описываете трудности, с которыми столкнулись, подробнее.

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

Hubbitus 08.10.2010 17:30

Цитата:

Сообщение от Платон (Сообщение 1725123)
нет в results находятся все отметки по всем предметам, - средний бал нужно найти!

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

Цитата:

Сообщение от Платон (Сообщение 1725123)
а в самом результате вывести имена студентов только с максимальными средними баллами.

То есть только один максимум, или, если есть такие же?
Думаю как-то так тогда:
Код:

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

Цитата:

Сообщение от Hubbitus (Сообщение 1725137)
Тогда нужно агрегатный AVG с группировкой.

То есть только один максимум, или, если есть такие же?

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

Сообщение от Hubbitus (Сообщение 1725137)
Думаю как-то так тогда:
Код:

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

Цитата:

Сообщение от Платон (Сообщение 1725140)
Так, только средние баллы получаем, и это всё понятно.

Ну так Вам только средние и имя и надо же. Впрочем Вы правы, сортировку я забыл добавить:
Код:

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 (Сообщение 1725141)
Ну так Вам только средние и имя и надо же.

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

Hubbitus 08.10.2010 19:02

Так запрос и выберет именно:
Цитата:

Сообщение от Платон (Сообщение 1725145)
макимальные средние и имя

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

Платон 08.10.2010 19:14

Цитата:

Сообщение от Hubbitus (Сообщение 1725150)
Так запрос и выберет именно:

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

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

Hubbitus 08.10.2010 20:36

Цитата:

Сообщение от Платон (Сообщение 1725155)
поэтому сразу не понял, что WITH TIES СВЯЗЫВАЕТ ИМЕНА.

WITH TIES ничего не связывает совершенно! Не очень понял о чем Вы, но единственное что здесь связывает таблицы это JOIN. Все остальное что делает подробно расписал выше в посте.


Часовой пояс GMT +4, время: 23:43.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.