powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по циклам
9 сообщений из 9, страница 1 из 1
Вопрос по циклам
    #39588974
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть таблицаЮр лицо КодТТ SKU Дата начала Дата окончания Дата Отгрузки Продажи00111 00001 SKU1 01.01.2018 10.01.2018 01.01.2018 5 400111 00001 SKU1 01.01.2018 10.01.2018 02.01.2018 0 100111 00001 SKU1 01.01.2018 10.01.2018 03.01.2018 0 000111 00001 SKU1 01.01.2018 10.01.2018 04.01.2018 5 200111 00001 SKU2 01.01.2018 10.01.2018 01.01.2018 0 300111 00001 SKU2 01.01.2018 10.01.2018 02.01.2018 0 000111 00001 SKU2 01.01.2018 10.01.2018 03.01.2018 0 000111 00001 SKU2 01.01.2018 10.01.2018 04.01.2018 3 1

Нужно получить такую таблицуЮр лицо КодТТ SKU Дата начала Дата окончания Дата Отгрузки Продажи ПродажиОбраб 00111 00001 SKU1 01.01.2018 10.01.2018 01.01.2018 5 4400111 00001 SKU1 01.01.2018 10.01.2018 02.01.2018 0 1100111 00001 SKU1 01.01.2018 10.01.2018 03.01.2018 0 0000111 00001 SKU1 01.01.2018 10.01.2018 04.01.2018 5 2200111 00001 SKU2 01.01.2018 10.01.2018 01.01.2018 0 3 0 00111 00001 SKU2 01.01.2018 10.01.2018 02.01.2018 0 0000111 00001 SKU2 01.01.2018 10.01.2018 03.01.2018 0 0000111 00001 SKU2 01.01.2018 10.01.2018 04.01.2018 3 11

Логика заключается в том, чтобы по каждому Юр лицу + ТТ + SKU поле ПродажиОбраб равен полю Продажи , но учитывает с того дня, где присутствует первая отгрузка.

Тут получается надо пробегаться по циклам, то есть по датам по соответствующим Юр лицу + ТТ + SKU .

1. Скажите, для данной задачи каким образом можно пробежаться по циклам?
2. Если я правильно понимаю, если использовать WHILE, то добавляем только строки в таблицу, но не пробегаем по строкам. Верно?

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.
DECLARE @Таблица1 table
([Юр лицо] varchar (5),
	[КодТТ] varchar (8),
	[SKU] varchar (4),	
	[Дата начала] date,
	[Дата окончания] date,
	[Дата] date,	
	[Отгрузки] integer,
	[Продажи] integer
	)
;
INSERT INTO
  @Таблица1
VALUES 
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','01.01.2018',5,4),
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','02.01.2018',0,1),
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','03.01.2018',0,0),
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','04.01.2018',5,2),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','01.01.2018',0,3),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','02.01.2018',0,0),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','03.01.2018',0,0),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','04.01.2018',3,1)
 ; 

...
Рейтинг: 0 / 0
Вопрос по циклам
    #39588989
ferzmikk,

циклы не нужны. всё и так сделать можно.
...
Рейтинг: 0 / 0
Вопрос по циклам
    #39588999
tashkafox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
Посмотрите про оконные функции
...
Рейтинг: 0 / 0
Вопрос по циклам
    #39589668
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Установлена Microsoft SQL Server Management 2008.

Код: sql
1.
SUM(Т1.[Отгрузки]) OVER (PARTITION BY Т1.[Юр лицо], Т1.[КодТТ], Т1.[SKU] ORDER BY Т1.[Дата] RANGE UNBOUNDED PRECEDING)

или
Код: sql
1.
SUM(Т1.[Отгрузки]) OVER (PARTITION BY Т1.[Юр лицо], Т1.[КодТТ], Т1.[SKU] ORDER BY Т1.[Дата] ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)

такие записи в этой версии не будут работать.

Если писать без этих оконных функции
Код: 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.
DECLARE @Таблица1 table
([Юр лицо] varchar (5),
	[КодТТ] varchar (8),
	[SKU] varchar (4),	
	[Дата начала] date,
	[Дата окончания] date,
	[Дата] date,	
	[Отгрузки] integer,
	[Продажи] integer
	)
;
INSERT INTO
  @Таблица1
VALUES 
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','01.01.2018',5,4),
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','02.01.2018',0,1),
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','03.01.2018',0,0),
  ( '00111', '00001','SKU1','01.01.2018','04.01.2018','04.01.2018',5,2),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','01.01.2018',0,3),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','02.01.2018',0,0),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','03.01.2018',0,0),
  ( '00111', '00001','SKU2','01.01.2018','04.01.2018','04.01.2018',3,1)
 ; 

SELECT
	ТТ1.[Юр лицо],		
	ТТ1.[КодТТ],
	ТТ1.[SKU],
	ТТ1.[Дата начала],
	ТТ1.[Дата окончания],
	ТТ1.[Дата],
	ТТ1.[Отгрузки],
	ТТ1.[Продажи],
	CASE WHEN ТТ1. [Накопленные отгрузки] > 0 THEN ТТ1.[Продажи] ELSE 0 END AS [ПродажиОбраб]
FROM
	(SELECT
		Т1.[Юр лицо],		
		Т1.[КодТТ],
		Т1.[SKU],
		Т1.[Дата начала],
		Т1.[Дата окончания],
		Т1.[Дата],
		Т1.[Отгрузки],
		Т1.[Продажи],
		(SELECT
			SUM (Тв1.[Отгрузки])
		FROM
			@Таблица1 Тв1
		WHERE
			Т1.[Юр лицо] = Тв1.[Юр лицо]
			AND
			Т1.КодТТ = Тв1.КодТТ
			AND
			Т1.SKU = Тв1.SKU
			AND
			Т1.Дата >= Тв1.Дата) AS [Накопленные отгрузки]	
	FROM
		@Таблица1 Т1) AS ТТ1

Но для большой выборки такой способ подтормаживает
...
Рейтинг: 0 / 0
Вопрос по циклам
    #39589671
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkНо для большой выборки такой способ подтормаживает
А чудесной кнопки нетути.

1. Индексы.
2. Расчет и сохранение в таблице. Обновление таблицы по мере необходимости.
3. Материализация через индексированные View.

ЗЫ. Ты ниповеришь, оконные функции "как-то так и считают". Так что, производительность на оконных не сильно превосходит "по старинке".
...
Рейтинг: 0 / 0
Вопрос по циклам
    #39589678
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkЛогика заключается в том, чтобы по каждому Юр лицу + ТТ + SKU поле ПродажиОбраб равен полю Продажи , но учитывает с того дня, где присутствует первая отгрузка.
Это первый пункт условия. Есть еще и другие условия пунктов, где нужно пробегаться по дням, потом в случае необходимости возвращаются к предыдущим датам, но не с первого. Несколько циклов. Несколько переменных. Условия бывают меняются. И получится, что запрос будет сложно корректировать.

И вот хотел узнать, возможно ли сделать так: по каждому Юр лицу + ТТ + SKU в пользовательскую функцию передается массив или таблица из трех полей Дата, Отгрузки,Продажи (Оранжевый цвет) и возвращает массив по соответствующим строкам (голубой цвет). Аналогично для последующих Юр лицу + ТТ + SKU . Пользовательская функция была бы написана на VB.Net или C#. Возможно ли так? Если да то, как?

Юр лицо КодТТ SKU Дата начала Дата окончания Дата Отгрузки ПродажиПродажиОбраб00111 00001 SKU1 01.01.2018 10.01.2018 01.01.2018 5 4400111 00001 SKU1 01.01.2018 10.01.2018 02.01.2018 0 1100111 00001 SKU1 01.01.2018 10.01.2018 03.01.2018 0 0000111 00001 SKU1 01.01.2018 10.01.2018 04.01.2018 5 2200111 00001 SKU2 01.01.2018 10.01.2018 01.01.2018 0 30
...
Рейтинг: 0 / 0
Вопрос по циклам
    #39589743
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkЮр лицо КодТТ SKU Дата начала Дата окончания Дата Отгрузки ПродажиПродажиОбраб00111 00001 SKU1 01.01.2018 10.01.2018 01.01.2018 5 4400111 00001 SKU1 01.01.2018 10.01.2018 02.01.2018 0 1100111 00001 SKU1 01.01.2018 10.01.2018 03.01.2018 0 0000111 00001 SKU1 01.01.2018 10.01.2018 04.01.2018 5 2200111 00001 SKU2 01.01.2018 10.01.2018 01.01.2018 0 30Так правильнее
Юр лицо КодТТ SKU Дата начала Дата окончания Дата Отгрузки ПродажиПродажиОбраб00111 00001 SKU1 01.01.2018 10.01.2018 01.01.2018 5 4400111 00001 SKU1 01.01.2018 10.01.2018 02.01.2018 0 1100111 00001 SKU1 01.01.2018 10.01.2018 03.01.2018 0 0000111 00001 SKU1 01.01.2018 10.01.2018 04.01.2018 5 22
...
Рейтинг: 0 / 0
Вопрос по циклам
    #39589926
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Вы должны пронумеровать отгрузки и сравнивать нарастающий итог продаж с отгрузкой. Как только продаж планируется абсолютно больше, чем отгрузок, прекращать продажи по текущему номеру продаж. Не нужны никакие циклы и переменные.
...
Рейтинг: 0 / 0
Вопрос по циклам
    #39589959
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовferzmikk,

Вы должны пронумеровать отгрузки и сравнивать нарастающий итог продаж с отгрузкой. Как только продаж планируется абсолютно больше, чем отгрузок, прекращать продажи по текущему номеру продаж. Не нужны никакие циклы и переменные .
Я говорю, что есть и другие пункты условия. До этого реализовывал в экселе с помощью VBA. Код был не простым, но подтормаживал.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по циклам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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