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

Откуда:
Сообщений: 38
Есть таблица, отражающая передачу документов с последовательно идущими номерами от start_num по end_num из одного места place_from в другое place_to:
place_from	place_to	[date]		start_num	end_num
NULL		1		2011-01-01	1		1000
1		2		2011-01-15	100		200
1		3		2011-01-17	500		700
3		1		2011-01-20	600		650

Никак не соображу, как процедурой вычислить, какие диапазоны номеров документов находятся в каком-либо месте @in_place на дату @on_date.

Например,
на 2011-01-17 в @in_place = 1 должно быть:
start_num	end_num
1		99
201		499
701		1000

Чтобы понятнее было, вот шаблон хранимой процедуры:
CREATE PROCEDURE rest_nums_in_place_on_date
	@in_place int = NULL, 
	@on_date datetime = GETDATE
AS
SET NOCOUNT ON;
SELECT 
	start_num,
	end_num
FROM
	t
WHERE
	date <= @on_date

Просто столбняк в голове какой-то, извините.
28 окт 11, 18:18    [11518266]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про движение пачек документов с последовательными номерами  [new]
iljy
Member

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

11184337
28 окт 11, 18:23    [11518301]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про движение пачек документов с последовательными номерами  [new]
aleks2
Guest
declare @t table(place_from int, place_to int, [date] datetime,	start_num int, end_num int)

insert @t
select NULL, 1, '20110101',	1, 1000
union all
select 1, 2, '20110115', 100, 200
union all
select 1, 3, '20110117', 500, 700
union all
select 3, 1, '20110120', 600, 650

declare @in_place int, @on_date datetime

set @on_date='20110117'
set @in_place = 1 

;with 
ev1 as
(
 select place_to place, [date], start_num num, 0 flag FROM @t WHERE place_to=@in_place AND [date]<=@on_date
 union all
 select place_from place, [date], end_num num, 1 flag FROM @t WHERE place_from=@in_place AND [date]<=@on_date
)
,
ev2 as
(
 select place_to place, [date], end_num num, 0 flag FROM @t WHERE place_to=@in_place AND [date]<=@on_date
 union all
 select place_from place, [date], start_num num, 1 flag FROM @t WHERE place_from=@in_place AND [date]<=@on_date
)
,
evn1 as
(select *, ROW_NUMBER() over(order by num ASC) n from ev1)
,
evn2 as
(select *, ROW_NUMBER() over(order by num ASC) n from ev2)

select evn1.place, evn1.date
, evn1.num+evn1.flag start_num
, evn2.num-evn2.flag end_num  
from evn1 inner join evn2 ON evn1.n=evn2.n ORDER BY evn1.date
28 окт 11, 20:00    [11518757]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про движение пачек документов с последовательными номерами  [new]
Alexs_001
Member

Откуда:
Сообщений: 38
огромное спасибо, aleks2, за понятный код и применение в коде обобщенного табличного выражения (ОТВ) WITH, которое раньше я почему-то не использовал! сегодня сдал работу! sql.ru - лучший сайт для разработчиков!!!
4 ноя 11, 12:42    [11550676]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить