Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
Здрасвуйте. Помогите пожалуйста. Есть база данных под MSSQL 2008

В ней есть несколько таблиц, в данный момент потребуется 3

первая таблица - kadri [кадры]

поля:

int idpk - идентификатор записи, PK
date vstuplenie - дата вступления в должность
date uhod - дата ухода с должности
int idrab - идентификатор рабочего, FK к таблице sotrudniki
int idpost - идентификатор должности, FK к leposte

вторая таблица sotrudniki
idrab - идентификатор, PK
fam - фамилия

Третья - leposte
idpost - идентификатор, PK
name - название

требуется написать процедуру, которая в качестве параметров берет 2 даты, одну начала, а вторую конца,
после чего формируется вывод таблицы, где первая колонка - фамилия сотрудника, вторая - был в должности, третья - перешел в должность, ну и дальше его движение по должностям за указанный период.

Собсвенно, вся проблема в запросе. вообще мыслей нету как писать его... Помогите плз

должно получиться чтото типо:

с ... по ...

Фамилия | Был | Стал |
Иванов | Слесарь | Старший слесарь |
Иванов | Старший слесарь | Суперстарший слесарь |
Петров | ------ | Экзорцист | (пояснение: взяли петрова на должность экозрциста в указанный период)
28 май 11, 20:16    [10725115]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
Получилось чтото лучшее с помощью

select sotrudniki.fam,leposte.namepost
	from kadri 
	inner join sotrudniki on sotrudniki.idrab = kadri.idrab
	inner join leposte on leposte.idpost = kadri.idpost
	where (vstuplenie>@a1) and (uhodsdolg<@a2 or uhodsdolg is null)	;

Но как добавить предыдущее значение в другую колонку это просто @_@
28 май 11, 20:35    [10725185]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
iljy
Member

Откуда:
Сообщений: 8711
elvenliedfun,
declare @t table (id int, N int)
insert @t values
(1,2),(1,5),(1,7),
(2,1),(2,9),(2,12)

;with cte as(
	select *, ROW_NUMBER() over(partition by id order by N) RN from @t
)
select t1.id, t1.N, t2.N
from cte t1 join cte t2 on t1.id = t2.id and t1.RN+1 = t2.RN
28 май 11, 20:49    [10725233]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
iljy,

не особо понимаю что это
28 май 11, 20:57    [10725258]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
elvenliedfun, еще вариант:
declare @t table (id int, N int)
insert @t values
(1,2),(1,5),(1,7),
(2,1),(2,9),(2,12)

;with cte as(
	select *, ROW_NUMBER() over(partition by id order by N) RN from @t
)
SELECT t.id, t1.N, t.N FROM cte t
OUTER APPLY (SELECT t1.N FROM cte t1 WHERE t.id=t1.id AND t1.RN = t.RN-1) t1
28 май 11, 20:58    [10725259]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
интересная штука, но как вместо циферок написать нужные мне значения? в transaq sql можно как нить в переменные выводить одно значение из бд?
28 май 11, 21:01    [10725274]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
iljy
Member

Откуда:
Сообщений: 8711
elvenliedfun,

можно например еще раз воспользоваться операцией соединения (JOIN).
28 май 11, 21:12    [10725314]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
with cte as(
		select *, ROW_NUMBER() over(partition by id order by N) RN from @t
	)


вообще не понимаю что делает ROW_NUMBER() over(partition by id order by N) RN
28 май 11, 21:24    [10725361]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
elvenliedfun, попробуйте почитать документацию. Помогает. Проверено.
28 май 11, 21:26    [10725375]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
пожалуйста, напишите код необходимой процедуры @_@

вот дамп

К сообщению приложен файл (mssql.sql - 3Kb) cкачать
28 май 11, 21:39    [10725412]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
Возвращает последовательный номер строки в секции результирующего набора, 1 соответствует первой строке в каждой из секций.

убейте меня @_@
28 май 11, 21:55    [10725461]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
iljy
Member

Откуда:
Сообщений: 8711
elvenliedfun,

замените в примере SELECT .... на SELECT * FROM CTE, многое станет понятнее.
28 май 11, 22:05    [10725501]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
elvenliedfun,

;WITH cte AS (
SELECT  *,
ROW_NUMBER() OVER (PARTITION BY k.idrab ORDER BY k.vstuplenie) rn
FROM    dbo.kadri k
)
SELECT t.*,s.fam, ISNULL(p1.name,'---') p1, p2.name p2
FROM cte t
OUTER APPLY (SELECT t1.idpost FROM cte t1 WHERE t.idrab=t1.idrab AND t1.RN = t.RN-1) t1
JOIN dbo.sotrudniki s ON s.idrab=t.idrab
LEFT JOIN dbo.posts p1 ON t1.idpost = p1.idpost
LEFT JOIN dbo.posts p2 ON t.idpost = p2.idpost
Вот заготовка, дальше уж сами.
28 май 11, 22:07    [10725504]     Ответить | Цитировать Сообщить модератору
 Re: требуется написать хранимую процедуру  [new]
elvenliedfun
Member

Откуда:
Сообщений: 17
kDnZP, iljy

Огромнейшее спасибо за восполнение моих пробелов в знаниях по mssql ^^
28 май 11, 23:16    [10725752]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить