Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на максимальное среднее значение, MSSQL Server 
:(
    Опции темы
Plathon
Дата 8.10.2010, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Теряюсь как правильно составить запрос.
Даны 2 таблицы связанные по id:
  Students(id, name) и Results(id,subject,mark), содержащих данные о студентах

Нужно  написать запрос, который выведет список студентов с максимальным средним баллом.

PM MAIL   Вверх
Akina
Дата 8.10.2010, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Plathon @  8.10.2010,  01:54 Найти цитируемый пост)
выведет список студентов с максимальным средним баллом

Либо студента (одного) с макс. средним баллом, либо всех студентов в порядке убывания (ещё раз прочти последние два слова... идею понял?) среднего балла.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Deniz
Дата 8.10.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Цитата(Akina @  8.10.2010,  09:25 Найти цитируемый пост)
Либо студента (одного) с макс. средним баллом
ну почему же одного? Есть же вероятность, что у 10 чел будут все пятерки.

Plathon, СУБД?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 8.10.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Если СУБД поддерживает подзапросы - задача решается легко... если нет - у тебя проблемы.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Plathon
Дата 8.10.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата(Deniz @ 8.10.2010,  09:48)
Цитата(Akina @  8.10.2010,  09:25 Найти цитируемый пост)
Либо студента (одного) с макс. средним баллом
ну почему же одного? Есть же вероятность, что у 10 чел будут все пятерки.

Plathon, СУБД?


MS SQL Server 2000
PM MAIL   Вверх
Akina
Дата 8.10.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

SELECT TOP 1 Results.id, Avg(Results.Mark) AS AvgMark
FROM Results
GROUP BY Results.id
ORDER BY Avg(Results.Mark) DESC;

Это работает в Аксессе (фича).
В MS SQL 2000 немного сложнее... (пока не было Инета - даже проверил, работает)
Код

ALTER FUNCTION dbo.GetBestStudents()
RETURNS TABLE
AS
RETURN 
(
SELECT
             dbo.Students.Name
FROM
             dbo.Students
INNER JOIN
             dbo.Results 
ON
             dbo.Students.id = dbo.Results.id 
CROSS JOIN   
(
   SELECT
   TOP 1
                dbo.Students.Name, 
                AVG(dbo.Results.mark) AS avgMark
   FROM
                dbo.Results 
   INNER JOIN
                dbo.Students 
   ON
                dbo.Results.id = dbo.Students.id
   GROUP BY
                dbo.Students.Name
) q
GROUP BY
             dbo.Students.Name,
             q.avgMark
HAVING       AVG(dbo.Results.mark) = q.avgMark
)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Plathon
  Дата 8.10.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Akina
Дата 8.10.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Plathon @  8.10.2010,  14:06 Найти цитируемый пост)
мне нужно получить максимальные значения из средних баллов    

Ну добавь их в список выбираемых полей, блин!


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Plathon
Дата 8.10.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



так просто? там надо подзапрос писать, для меня это не совсем просто
PM MAIL   Вверх
Akina
Дата 8.10.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Да, так просто. И никакой подзапрос писать не надо, уже всё посчитано.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Deniz
Дата 8.10.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Цитата(Akina @  8.10.2010,  14:55 Найти цитируемый пост)
Это работает в Аксессе (фича).
в SQL 2000 тоже работает
Код
select t1.id, avg(t1.Mark)
from Results t1
group by t1.id
having avg(t1.Mark) =
(select top 1 avg(t.Mark) from Results t group by t.id order by 1 desc)
примерно так, думаю join с Students и вывод Name'ов не составит труда?

Это сообщение отредактировал(а) Deniz - 8.10.2010, 14:29


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 8.10.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Deniz @  8.10.2010,  15:28 Найти цитируемый пост)
в SQL 2000 тоже работает

Нет. В MS Sql сказано - один, значит один. даже если первые несколько записей имеют одинаковое макс. значение ключа сортировки.

Цитата(Deniz @  8.10.2010,  15:28 Найти цитируемый пост)
having avg(t1.Mark) =
(select ...

Ты хочешь сказать, что MS SQL Server 2000 согласится обработать ТАКОЕ?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Plathon
Дата 8.10.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата(Akina @ 8.10.2010,  14:06)
Да, так просто. И никакой подзапрос писать не надо, уже всё посчитано.

ну сначала же подсчитывает avg()  в списке средний бал для каждого студента, а в конечном результате нужно получить список с максимальным баллом.
как жеж тут без подзапроса обойтись???
PM MAIL   Вверх
Zloxa
Дата 8.10.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



не знаю, прокатит ли.. и есть ли эта опция в 2к
Код

select top (1) WITH TIES t1.id, avg(t1.Mark),max(t1.mark)
from Results t1
group by t1.id
order by 2 desc


Добавлено @ 14:44
Цитата(Zloxa @  8.10.2010,  14:41 Найти цитируемый пост)
есть ли эта опция в 2к

есть!

Это сообщение отредактировал(а) Zloxa - 8.10.2010, 14:44


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 8.10.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Zloxa @  8.10.2010,  15:41 Найти цитируемый пост)
WITH TIES 

Блин!!! всё время забываю про эту штукенцию :( 




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.