powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Раскидать остатки между заявками с критериями
10 сообщений из 10, страница 1 из 1
Раскидать остатки между заявками с критериями
    #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
Раскидать остатки между заявками с критериями
    #39833912
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

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

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

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

попробуйте нарастающий по срокам годности сравнить с нарастающим по отгрузке.
...
Рейтинг: 0 / 0
Раскидать остатки между заявками с критериями
    #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
Раскидать остатки между заявками с критериями
    #39834034
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Циклом автор написал, что и сам сможет :)
...
Рейтинг: 0 / 0
Раскидать остатки между заявками с критериями
    #39834061
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

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

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

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

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


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