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

Откуда:
Сообщений: 474
Есть товар на складе, есть счета на отгрузку, есть предстоящие поставки.
Как выстроить последовательность так, что бы при недостатке товара на складе, впереди счетов на отгрузку стояла предстящая поставка, обсепечивающая товаром соответсвующие счета?


declare @t table(PartNumber nvarchar(8),  SO nvarchar(10), PO nvarchar(10), Qty int default 0, sQty int default 0, upPO nvarchar(10))

-- данные счетов на отгрузку
insert into @t (PartNumber,SO,PO,Qty)
-- товар 'A1111111'
select 'A1111111', 'SO10000000', NULL, 3 union all
select 'A1111111', 'SO10000001', NULL, 5 union all
select 'A1111111', 'SO10000002', NULL, 7 union all
select 'A1111111', 'SO10000003', NULL, 8 union all
select 'A1111111', 'SO10000005', NULL, 1 union all
-- товар 'A2222222'
select 'A2222222', 'SO10000000', NULL, 3 union all
select 'A2222222', 'SO10000001', NULL, 1 union all
select 'A2222222', 'SO10000002', NULL, 2 union all
select 'A2222222', 'SO10000004', NULL, 5 union all
select 'A2222222', 'SO10000006', NULL, 3 


-- данные склада
insert into @t (PartNumber,SO,PO,Qty)
-- товар 'A1111111'
select 'A1111111', NULL, NULL, 4 union all
-- товар 'A2222222'
select 'A2222222', NULL, NULL, 5 

-- данные  предстоящих поставок
insert into @t (PartNumber,SO,PO,Qty)
-- товар 'A1111111'
select 'A1111111',  NULL,'PO10000001', 15 union all
select 'A1111111',  NULL,'PO10000002',  5 union all
-- товар 'A2222222'
select 'A2222222',  NULL,'PO10000003',  3 union all
select 'A2222222',  NULL,'PO10000004',  1 union all
select 'A2222222',  NULL,'PO10000008',  2 union all
select 'A2222222',  NULL,'PO10000011',  5 union all
select 'A2222222',  NULL,'PO10000006',  3 


-- нарастающим итогом счета на отгрузку
update T SET sQty=TT.tot_sum
from @t T inner join 
(select  a.PartNumber, a.so, max(a.qty) as qty, sum(isnull(b.qty, 0))+max(a.qty) as tot_sum
from @t a 
left outer join @t b on b.so < a.so and b.PartNumber=a.PartNumber
group by a.PartNumber, a.so
) TT
ON T.SO=TT.SO and t.PartNumber = tt.PartNumber


-- нарастающим итогом предстоящие поставки
update T SET sQty=TT.tot_sum
from @t T inner join 
(select  a.PartNumber, a.po, max(a.qty) as qty, sum(isnull(b.qty, 0))+max(a.qty) as tot_sum
from @t a 
left outer join @t b on b.po < a.po and b.PartNumber=a.PartNumber
group by a.PartNumber, a.po
) TT
ON T.PO=TT.PO and t.PartNumber = tt.PartNumber

-- для отладки  
-- видим что в sQty действительно данные про счетам и поставкам идут нарастающим итогом
--select * from @t

-- подготавливаем поле upPO для внесения в него номеров предстоящих поставок
-- сначала просто дублируем
update T SET upPO=T.PO
from @t T 
WHERE T.PO is not null

-- для отладки  
-- видим что в sQty действительно данные про счетам и поставкам идут нарастающим итогом--
--select * from @t

-- а вот теперь НЕ ЗНАЮ КАК сделать, 
-- это код для подготовки сортировки но без учета группировки по полю PartNumber
update T SET upPO=(select min(X.PO) FROM @t X WHERE X.sQty>=T.sQty  )
from @t T 
WHERE T.SO is not null 

select * from @t
31 окт 11, 06:08    [11523921]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающим итогом с учетом группировки по коду товара  [new]
aleks2
Guest
Тут предлагается восхитится или надо что-то свое предложить?

СТЕ, не?
31 окт 11, 08:06    [11523970]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающим итогом с учетом группировки по коду товара  [new]
Thermik
Member [скрыт]

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

Вопрос был, как последний UPDATE правильно написать.
31 окт 11, 10:01    [11524328]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить