Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Раскидать остатки между заявками с критериями / 10 сообщений из 10, страница 1 из 1
04.07.2019, 15:21
    #39833875
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Ребят, что-то я не могу ничего придумать, не охота использовать курсор и бегать по строчкам
может кто уже решал подобную задачу на t-sql

Есть таблица с данными
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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
У меня получилось, но не пойму куда задать условие по сроком годности
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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.55107stock0.78218stock0.95162stock0.55265orders10.775.95-75.95orders20.752.45-2.45orders30.8159.25-159.25orders40.62.45-2.45orders40.8931-511.9orders50.775.95orders60.75100.45orders60.81229.9orders70.8134.75

а как реализовать ниже
...
Рейтинг: 0 / 0
04.07.2019, 16:09
    #39833912
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Focha,

похоже на расчёт нарастающего итога. Варианты есть в FAQ.
...
Рейтинг: 0 / 0
04.07.2019, 16:14
    #39833919
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Владислав КолосовFocha,

похоже на расчёт нарастающего итога. Варианты есть в FAQ.
да, это я смог реализовать

Версия MSSQL: Microsoft SQL Server 2017
...
Рейтинг: 0 / 0
04.07.2019, 16:23
    #39833924
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Focha,

попробуйте нарастающий по срокам годности сравнить с нарастающим по отгрузке.
...
Рейтинг: 0 / 0
04.07.2019, 18:21
    #39834000
Сруль.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Вы, это, не сердитесь на старого еврея.
Но у меня сразу возникла с Вами разногласиЯ по постановке.
Все эти суммы, по моему, как бы, надо бы считать потом.
А сначало разобраться с датами срока годности.
Решение, типа, такое, как вариант.
Беготня по строчкам есть, но без курсора-ни разу не подводила.
Можно об этом спорить,
простой код работает быстрее, а где собьётся легче поправить.
Не владею я всеми этими оверами,
шесть лет до пенсии, раньше обходился, дотяну, как нибудь, без них.
Я со спецом вывел 2 селекта, чтоб Вы мы могли проверить динамику на складе.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
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
...
Рейтинг: 0 / 0
04.07.2019, 19:07
    #39834034
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Циклом автор написал, что и сам сможет :)
...
Рейтинг: 0 / 0
04.07.2019, 20:22
    #39834061
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Focha,

А в чем у вас разница между первым и последним stock?
...
Рейтинг: 0 / 0
05.07.2019, 08:57
    #39834158
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Сруль.Вы, это, не сердитесь на старого еврея.
Но у меня сразу возникла с Вами разногласиЯ по постановке.
Все эти суммы, по моему, как бы, надо бы считать потом.
А сначало разобраться с датами срока годности.
Решение, типа, такое, как вариант.
Беготня по строчкам есть, но без курсора-ни разу не подводила.
Можно об этом спорить,
простой код работает быстрее, а где собьётся легче поправить.
Не владею я всеми этими оверами,
шесть лет до пенсии, раньше обходился, дотяну, как нибудь, без них.
Я со спецом вывел 2 селекта, чтоб Вы мы могли проверить динамику на складе.

Это понятно, спасибо, что потратили время и реализовали, то что я сделал вчера.
...
Рейтинг: 0 / 0
05.07.2019, 08:58
    #39834159
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
Владислав КолосовFocha,

попробуйте нарастающий по срокам годности сравнить с нарастающим по отгрузке.
короче через цикл сделал
...
Рейтинг: 0 / 0
05.07.2019, 09:00
    #39834161
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскидать остатки между заявками с критериями
PizzaPizzaFocha,

А в чем у вас разница между первым и последним stock?
Условий проверки там больше, в примере хотел показать, сумму больше.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Раскидать остатки между заявками с критериями / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]