Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2010, 15:17   #1
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию Процедура SQL

Есть БД:
Код:
Create table Staff
(
ID_S Int Primary key,
Name varchar (50) not null,
)

Create table Dep
(
ID_D Int Primary key,
title varchar (50) not null,
)

Create table SD
(
ID_S Int not null references Staff(ID_S),
ID_D Int not null references Dep(ID_D),
Salary int
)
Нужно Вывести по три сотрудника каждой профессии с максимальной зарплатой.

пример заполнения:
Код:
Insert into Staff values (0, 'Попов Виктор')
Insert into Staff values (1, 'Сидоров Иван')
Insert into Staff values (2, 'Ивонов Илья')
Insert into Staff values (3, 'Зеликов Михаил')
Insert into Staff values (4, 'Драбун Дмитрий')
Insert into Staff values (5, 'Никулин Юрий')
Insert into Staff values (6, 'Коваленко Михаил')
Insert into Staff values (7, 'Хафизова Кристина')
Insert into Staff values (8, 'Толстенко Евгений')

Insert into Dep values (0, 'Инженер')
Insert into Dep values (1, 'Админ')

Insert into SD values ('0', '0', '100')
Insert into SD values ('1', '1', '200')
Insert into SD values ('2', '0', '300')
Insert into SD values ('3', '1', '400')
Insert into SD values ('4', '0', '500')
Insert into SD values ('5', '1', '600')
Insert into SD values ('6', '0', '700')
Insert into SD values ('7', '1', '800')
Insert into SD values ('8', '0', '900')
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 25.11.2010, 15:24   #2
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

я представляю это как то так, но у меня очень большие проблемы с синтаксисом, просьба подправить, читал теорию - очень непонятно... помогите пожалуйста...
Код:
create proc First @per_zero int=null output, @per_one int=null output
as
    begin
        set @per_zero = select max(Salary) from SD where (SD.ID_D = '0')
        set @per_one = select max(Salary) from SD where (SD.ID_D = '1')

        select name as ФИО, title as Профессия, Salary as Зарплата 
        from Staff,SD,Dep
        where    ((Staff.ID_S = SD.ID_S) and
                (Dep.ID_D = '0') and (SD.Salary = @per_zero) and (SD.Salary = @per_zero - 1) and (SD.Salary = @per_zero - 2))
        order by Staff.Name

        select name as ФИО, title as Профессия, Salary as Зарплата 
        from Staff,SD,Dep
        where    ((Staff.ID_S = SD.ID_S) and
                (Dep.ID_D = '1') and (SD.Salary = @per_two) and (SD.Salary = @per_two - 1) and (SD.Salary = @per_two - 2))
        order by Staff.Name
    end
go
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 26.11.2010, 15:57   #3
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

Код:
Select Staff.Name, SD.Salary, Dep.Title
from Dep, SD,Staff

WHERE  Staff.ID_S=SD.ID_S
and Dep.ID_D between 0 and (select  count(ID_D)from Dep)
and  SD.ID_D =Dep.ID_D
and SD.Salary in (select top 3 Salary from Staff)
order by Salary desc
только он не перебирает а берет просто максимальные зарплаты из всего количества сотрудников, а надо из каждой группы сотрудников.
З.Ы. Группа сотрудников - это dep.title
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 26.11.2010, 16:14   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если мне память не ошибает Том Кайт в своей книге похожий пример решал используя аналитические функции. Попробуй про них почитать, они помоему как раз для этого и придуманы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2010, 16:33   #5
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

А не мог бы ты мне скинуть ссылку?
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 26.11.2010, 16:53   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

У меня книга в бумажном виде
И она под Оракл, я не знаю что у тебя за СУБД, но погугли по фразе "аналитические функции в базах данных"
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2010, 03:36   #7
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

СУБД - MS SQL Server (не мой выбор)
Решил вот таким вот образом:
Код:
SELECT Staff.Name, SD.Salary, Dep.Title FROM
(
SELECT Staff.Name, SD.Salary, Dep.Title, RANK() OVER(PARTITION BY Dep.Title ORDER BY SD.Salary) num
FROM Dep
) X
WHERE num <= 3
но столкнулся с проблемой в 2005 версии скула ругается на функцию RANK()...
говорит мол нет такой функции, хотя дома все прекрасно работает... в чем подвох, мне надо чтобы на 2005 запустилось

Так же сказали, что данный вопрос можно сделать с помощью курсора, но я понятия не имею что это такое, был бы признателен если бы показали вариант с курсором.
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедура SQL Beginrog Помощь студентам 3 27.08.2010 12:38
SQL процедура DELETE mar4elo БД в Delphi 9 22.02.2010 23:24
Процедура в процедура в C++ Builder Ecosasha C++ Builder 2 06.06.2009 17:17
SQL процедура вместо перебора записей XPAiN БД в Delphi 5 11.09.2008 13:59