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

Откуда: Москва
Сообщений: 400
Ребят, что-то я не могу ничего придумать, не охота использовать курсор и бегать по строчкам
может кто уже решал подобную задачу на t-sql

Есть таблица с данными
drop table #calc
create table #calc
(
	 type_data varchar(50) not null -- тип данных заказ / остатки
	,id_client int null -- клиент
	,stock_exp_date float null -- срок годности товара на остатках  например: 0.55 - осталось 55% срок годности
	,stock_kg float null -- кол-во на остатках
	,order_exp_date float null -- срок годности ограничения, ниже данного показателя нельзя отгружать
	,order_kg float null  -- кол-во заказанного

)

insert into #calc
select 'stock',		null,		0.55,	107,	null,	null	union all
select 'stock',		null,		0.78,	218,	null,	null	union all		
select 'stock',		null,		0.95,	162,	null,	null	union all			
select 'stock',		null,		0.55,	265,	null,	null	union all	
select 'orders',	1,		null,	null,	0.7,    75.95	union all
select 'orders',	2,		null,	null,	0.75,   2.45	union all
select 'orders',	3,		null,	null,	0.8,    159.25	union all
select 'orders',	4,		null,	null,	0.8,    931		union all
select 'orders',	4,		null,	null,	0.6,    2.45	union all	
select 'orders',	5,		null,	null,	0.7,    75.95	union all	
select 'orders',	6,		null,	null,	0.75,   100.45	union all	
select 'orders',	6,		null,	null,	0.8,    1229.9	union all	
select 'orders',	7,		null,	null,	0.8,    134.75	


Нужно раскинуть остатки по заказам с приоритетом по номеру клиента и order_exp_date
У меня получилось, но не пойму куда задать условие по сроком годности
select *
		,CASE 
			WHEN SUM(order_kg) OVER (order by id_client, order_exp_date) -
				 SUM(stock_kg) OVER () < 0 

			THEN - order_kg
			
			WHEN SUM(order_kg) OVER (order by id_client, order_exp_date) -
				 SUM(stock_kg)   OVER () < order_kg 

			THEN SUM(order_kg) OVER (order by id_client, order_exp_date) -
				 SUM(stock_kg)   OVER () - order_kg
		END 
from #calc


мой результат не учитывает сроки годности

type_dataid_clientstock_exp_datestock_kgorder_exp_dateorder_kgрасчет
stock0.55107
stock0.78218
stock0.95162
stock0.55265
orders10.775.95-75.95
orders20.752.45-2.45
orders30.8159.25-159.25
orders40.62.45-2.45
orders40.8931-511.9
orders50.775.95
orders60.75100.45
orders60.81229.9
orders70.8134.75


а как реализовать ниже

К сообщению приложен файл. Размер - 145Kb
4 июл 19, 15:21    [21920841]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Владислав Колосов
Member

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

похоже на расчёт нарастающего итога. Варианты есть в FAQ.
4 июл 19, 16:09    [21920885]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Focha
Member

Откуда: Москва
Сообщений: 400
Владислав Колосов
Focha,

похоже на расчёт нарастающего итога. Варианты есть в FAQ.

да, это я смог реализовать

Версия MSSQL: Microsoft SQL Server 2017
4 июл 19, 16:14    [21920893]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Владислав Колосов
Member

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

попробуйте нарастающий по срокам годности сравнить с нарастающим по отгрузке.
4 июл 19, 16:23    [21920901]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Сруль.
Member

Откуда:
Сообщений: 107
Вы, это, не сердитесь на старого еврея.
Но у меня сразу возникла с Вами разногласиЯ по постановке.
Все эти суммы, по моему, как бы, надо бы считать потом.
А сначало разобраться с датами срока годности.
Решение, типа, такое, как вариант.
Беготня по строчкам есть, но без курсора-ни разу не подводила.
Можно об этом спорить,
простой код работает быстрее, а где собьётся легче поправить.
Не владею я всеми этими оверами,
шесть лет до пенсии, раньше обходился, дотяну, как нибудь, без них.
Я со спецом вывел 2 селекта, чтоб Вы мы могли проверить динамику на складе.
drop table #calc
drop table #t3
drop table #t4
go
create table #calc
(
	 type_data varchar(50) not null -- тип данных заказ / остатки
	,id_client int null -- клиент
	,stock_exp_date float null -- срок годности товара на остатках  например: 0.55 - осталось 55% срок годности
	,stock_kg float null -- кол-во на остатках
	,order_exp_date float null -- срок годности ограничения, ниже данного показателя нельзя отгружать
	,order_kg float null  -- кол-во заказанного
)
insert into #calc
select 'stock',		null,		0.55,	107,	null,	null	union all
select 'stock',		null,		0.78,	218,	null,	null	union all		
select 'stock',		null,		0.95,	162,	null,	null	union all			
select 'stock',		null,		0.55,	265,	null,	null	union all	
select 'orders',	1,		null,	null,	0.7,    75.95	union all
select 'orders',	2,		null,	null,	0.75,   2.45	union all
select 'orders',	3,		null,	null,	0.8,    159.25	union all
select 'orders',	4,		null,	null,	0.8,    931		union all
select 'orders',	4,		null,	null,	0.6,    2.45	union all	
select 'orders',	5,		null,	null,	0.7,    75.95	union all	
select 'orders',	6,		null,	null,	0.75,   100.45	union all	
select 'orders',	6,		null,	null,	0.8,    1229.9	union all	
select 'orders',	7,		null,	null,	0.8,    134.75	



select *
into #t3		
from #calc
where #calc.type_data='stock'

select * from #t3

select t1.id_client,
	   t1.order_exp_date,
min(t2.stock_exp_date) stock_exp_date,	
	   convert(float,0) stock_remain_after_order,   
	   t1.order_kg,


identity(int) id
into #t4
from 
#calc T1,
#calc T2

where T1.order_exp_date is not null
  and T1.order_exp_date<=T2.stock_exp_date
  group by t1.id_client,
	   t1.order_exp_date,
	   t1.order_kg


declare @id int , @id_max int

select @id=1, @id_max=MAX(id)
from #t4

while (@id<=@id_max)
begin

update #t4
set stock_remain_after_order=#t3.stock_kg - #t4.order_kg
from #t3,
#t4
where #t3.stock_exp_date=#t4.stock_exp_date and #t4.id=@id

update #t3
set stock_kg=#t4.stock_remain_after_order
from #t3,
#t4
where #t3.stock_exp_date=#t4.stock_exp_date and #t4.id=@id


set @id=@id+1
end

select * from #t4


К сообщению приложен файл. Размер - 57Kb
4 июл 19, 18:21    [21921021]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6536
Циклом автор написал, что и сам сможет :)
4 июл 19, 19:07    [21921062]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
PizzaPizza
Member

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

А в чем у вас разница между первым и последним stock?
4 июл 19, 20:22    [21921108]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Focha
Member

Откуда: Москва
Сообщений: 400
Сруль.
Вы, это, не сердитесь на старого еврея.
Но у меня сразу возникла с Вами разногласиЯ по постановке.
Все эти суммы, по моему, как бы, надо бы считать потом.
А сначало разобраться с датами срока годности.
Решение, типа, такое, как вариант.
Беготня по строчкам есть, но без курсора-ни разу не подводила.
Можно об этом спорить,
простой код работает быстрее, а где собьётся легче поправить.
Не владею я всеми этими оверами,
шесть лет до пенсии, раньше обходился, дотяну, как нибудь, без них.
Я со спецом вывел 2 селекта, чтоб Вы мы могли проверить динамику на складе.

Это понятно, спасибо, что потратили время и реализовали, то что я сделал вчера.
5 июл 19, 08:57    [21921303]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Focha
Member

Откуда: Москва
Сообщений: 400
Владислав Колосов
Focha,

попробуйте нарастающий по срокам годности сравнить с нарастающим по отгрузке.

короче через цикл сделал
5 июл 19, 08:58    [21921305]     Ответить | Цитировать Сообщить модератору
 Re: Раскидать остатки между заявками с критериями  [new]
Focha
Member

Откуда: Москва
Сообщений: 400
PizzaPizza
Focha,

А в чем у вас разница между первым и последним stock?

Условий проверки там больше, в примере хотел показать, сумму больше.
5 июл 19, 09:00    [21921308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить