Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите построить запрос, плиз! / 18 сообщений из 18, страница 1 из 1
27.07.2001, 07:12
    #32010491
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Есть таблица с поялми Code, Name, Speciality (код специальности), Score(результат экзамена), это абитуриенты с результатами экзамена. Нужно посчитать проходной бал на каждой специальности, если на специальность максимум 25 человек! Помогите, а то даже не знаю откуда плясать... Заранее спасибо!
...
Рейтинг: 0 / 0
27.07.2001, 07:24
    #32010494
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
SELECT Speciality, AVG(Score)
FROM mytable
GROUP BY Speciality HAVING (COUNT(*) > 25)
...
Рейтинг: 0 / 0
27.07.2001, 07:26
    #32010495
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Извиняюсь - поторопился и недочитал.
А как рассчитывается проходной балл ?
...
Рейтинг: 0 / 0
27.07.2001, 07:33
    #32010499
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Есть 25 мест, зачисляются абитуриенты с наивысшими оценками, проходной бал - это минимальная такая оценка, с которой человек будет зачислен.
...
Рейтинг: 0 / 0
27.07.2001, 07:37
    #32010500
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Это понятно, что минимальная . Проходной балл задается как переменная или должен рассчитываться из этой же таблицы ?
...
Рейтинг: 0 / 0
27.07.2001, 07:39
    #32010501
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Select top 25 sp.speciality, min(sc.score)
from Speciality sp, score sc
where sp.ID = sc.ID
group by sp.spesiality

Я правда не знаю точно можно ли ставить вместе top и group by, но если можно, то по моему должно работать, сорри проверять лень, особенно после вчерашнего пива
...
Рейтинг: 0 / 0
27.07.2001, 07:41
    #32010502
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Кстати в свое время довелось 3 года проработать в приемной комиссии, правда тогда работал на FoxPro
...
Рейтинг: 0 / 0
27.07.2001, 07:51
    #32010505
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
To Glory:
Задача как раз и стоит что бы посчитать этот проходной бал!
...
Рейтинг: 0 / 0
27.07.2001, 07:54
    #32010506
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
To Genady:
Обязательно попробую вечером! Но что-то не верится как-то...
...
Рейтинг: 0 / 0
27.07.2001, 08:04
    #32010511
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
2 Zelius

Не не получится с моим запросом, он вернет первые 25 записей а потом группировать будет, но топтаться по моему в этом направлении нужно.
...
Рейтинг: 0 / 0
27.07.2001, 08:07
    #32010513
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
То есть я хотел сказать что этот запрос сработает по одной специальности, если условие в where поставить. самый тупой варинат в цикле перебрать все специальности, но вероятно что то можно и поизящнее придумать мне просто сейчас думается с трудом
...
Рейтинг: 0 / 0
27.07.2001, 08:18
    #32010517
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Если с ходу, не задумываясь, то так:
declare @mytable table ( name varchar(33), Speciality int, Score int)

SELECT Speciality, min(Score)
from @mytable m1
where m1.name in (select top 25 m2.name from @mytable m2 where m1.Speciality=m2.Speciality order by Score desc)
group by Speciality

Понятно что это неоптимально по скорости. Но думать лень. Надеюсь хоть откуда плясать Вы теперь знаете

Единственно я не понял для чего Code надо.
...
Рейтинг: 0 / 0
27.07.2001, 08:20
    #32010518
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Я вот тоже подумал, что должен быть более изящный способ, чем создавать временную таблицу, курсор, ходить и считать для каждой специальности отдельно несколькими запросами...
...
Рейтинг: 0 / 0
27.07.2001, 08:34
    #32010523
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
А можно в качестве TOP передать значение поля, если количество мест на специальности будет храниться в таблице специальностей?
...
Рейтинг: 0 / 0
27.07.2001, 08:41
    #32010525
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
в качестве TOP передать значение поля нельзя, так что развиваете такой вариант:

select Speciality, min(Score)
from
(SELECT m1.Speciality, m1.Score
from @mytable m1, @mytable m2
where m1.Speciality=m2.Speciality and m2.Score>=m1.Score
group by m1.Speciality, m1.Score
having count(*)<=25) as ss
group by Speciality

(проверьте, я мог неправильно поставать больше-меньше)
...
Рейтинг: 0 / 0
30.07.2001, 08:44
    #32010649
ChA+
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Вообще говоря, задача более сложна, нежели может показаться на первый взгляд.
Возможная ситуация - 30 абитуриентов набрали на экзаменах максимальный балл.
И что тогда делать ? Смотреть по национальности и партийности ? А может еще
и душещипательную беседу провести ? Патронов на всех может не хватить
Впрочем, это проблема приемной комиссии...
Есть подозрение, что код ниже - как раз то, что Вам нужно.

/*Создать тестовую таблицу*/
CREATE TABLE Table1 (Code int NOT NULL, Speciality tinyint NOT NULL, Score tinyint NULL)
GO
ALTER TABLE Table1 WITH NOCHECK ADD CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED (Code, Speciality)
GO

/*Добавить тестовые данные. Простейший случай...*/
DECLARE @i tinyint
SET @i = 1
WHILE @i < 51 BEGIN
INSERT INTO Table1 (Code, Speciality, Score) VALUES (@i, 1, @i)
SET @i = @i + 1
END
SET @i = 1
WHILE @i < 101 BEGIN
INSERT INTO Table1 (Code, Speciality, Score) VALUES (50 + @i, 2, @i)
SET @i = @i + 1
END

/*Основной запрос. Возвращает минимальный балл, которую должен иметь абитуриент
дабы попасть в число 25 "счастливчиков"*/
SELECT t1.Speciality, MIN(t1.Score) AS Score FROM Table1 t1
WHERE t1.Score IN (SELECT TOP 25 Score FROM Table1 t2 WHERE t2.Speciality = t1.Speciality ORDER BY t2.Score DESC)
GROUP BY t1.Speciality

/*Дополнительный запрос. Возвращает "счастливчиков", имеющих балл не ниже проходного.
В соотвествии со сказанным в начале, может превышать 25 человек*/
SELECT t.* FROM (SELECT t1.Speciality, MIN(t1.Score) AS Score FROM Table1 t1
WHERE t1.Score IN (SELECT TOP 25 Score FROM Table1 t2 WHERE t2.Speciality = t1.Speciality ORDER BY t2.Score DESC)
GROUP BY t1.Speciality) AS st INNER JOIN Table1 t
ON (t.Speciality = st.Speciality AND t.Score >= st.Score)

P.S. Если для каждой специальности свое количество вакансий, то
одним запросом это будет посложнее изобразить, но тоже, пожалуй,
можно. Думать надо, но времени
P.S. И напрасно Вы избегаете курсоров, в частности - FORWARD_ONLY,
но это отдельный разговор.
...
Рейтинг: 0 / 0
30.07.2001, 08:46
    #32010651
ChA+
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Сорри, Просмотрел... Подобный вариант уже был
...
Рейтинг: 0 / 0
30.07.2001, 09:07
    #32010653
ChA+
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос, плиз!
Различие в запросах все-таки есть, хотя и незначительное...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите построить запрос, плиз! / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]