Каталог решений - Задача по 1С — в базе данных есть таблица движения товара, пишем запрос для определения среднего значения остатка товара

Задача по 1С — в базе данных есть таблица движения товара, пишем запрос для определения среднего значения остатка товара

Задача по 1С — в базе данных есть таблица движения товара, пишем запрос для определения среднего значения остатка товара

В наличии

В базе данных есть таблица движения товара, плюс означает, что товар пришел на склад, минус означает, что товар выбыл со склада:
Необходимо написать запрос на 1С или SQL (по желанию), который вернет среднее значение остатка товара за январь 2021 (с 1 по 31).
В результате должно получиться
ProdID 1 = 1.58
ProdID 2 = 0.77

Категория:

Описание

Итак, изложу свой способ решения, не претендую на идеальный, пишите, если что-то не так.

1. Нашел формулу расчета, исходя из ответа —  получаю ОстатокНаКонецДня на каждый день месяца, суммирую и делю на количество дней в месяце.

2. Кратко о запросе, получил остатки на конец дня, номера дней в месяце по дате, нарастающим итогом собрал суммы за месяц.

В параметрах таблица как на картинке и ДатаОкончания — 31.01.2022

 

Сам запрос:

ВЫБРАТЬ
	ТаблицаДвижений.ProdiD КАК ProdiD,
	ТаблицаДвижений.Количество КАК Количество,
	ТаблицаДвижений.cDate КАК cDate
ПОМЕСТИТЬ ТабДвижений
ИЗ
	&ТаблицаДвижений КАК ТаблицаДвижений
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ТабДвижений.ProdiD КАК ProdiD,
	ТабДвижений.Количество КАК Количество,
	ТабДвижений.cDate КАК cDate,
	СУММА(ТабДвижений1.Количество) КАК Количество1
ПОМЕСТИТЬ ОстатокНаКонецДня
ИЗ
	ТабДвижений КАК ТабДвижений
		ЛЕВОЕ СОЕДИНЕНИЕ ТабДвижений КАК ТабДвижений1
		ПО ТабДвижений.cDate >= ТабДвижений1.cDate
			И ТабДвижений.ProdiD = ТабДвижений1.ProdiD

СГРУППИРОВАТЬ ПО
	ТабДвижений.ProdiD,
	ТабДвижений.Количество,
	ТабДвижений.cDate
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ОстатокНаКонецДня.ProdiD КАК ProdiD,
	ОстатокНаКонецДня.cDate КАК cDate,
	ОстатокНаКонецДня.Количество1 КАК Количество1
ПОМЕСТИТЬ НомерДняВр
ИЗ
	ОстатокНаКонецДня КАК ОстатокНаКонецДня
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	НомерДняВр.ProdiD КАК ProdiD,
	&ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ КонецМесяца
ИЗ
	НомерДняВр КАК НомерДняВр
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	НомерДняВр.ProdiD КАК ProdiD,
	НомерДняВр.cDate КАК cDate,
	НомерДняВр.Количество1 КАК Количество
ПОМЕСТИТЬ ДвиженияПлюсКонецМесяца
ИЗ
	НомерДняВр КАК НомерДняВр

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
	КонецМесяца.ProdiD,
	КонецМесяца.ДатаОкончания,
	0
ИЗ
	КонецМесяца КАК КонецМесяца
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДвиженияПлюсКонецМесяца.ProdiD КАК ProdiD,
	ДвиженияПлюсКонецМесяца.cDate КАК cDate,
	ДвиженияПлюсКонецМесяца.Количество КАК Количество,
	ДЕНЬ(ДвиженияПлюсКонецМесяца.cDate) КАК День
ПОМЕСТИТЬ НомерДня
ИЗ
	ДвиженияПлюсКонецМесяца КАК ДвиженияПлюсКонецМесяца
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	НомерДня.ProdiD КАК ProdiD,
	НомерДня.cDate КАК cDate,
	НомерДня.Количество КАК Количество,
	НомерДня.День КАК День,
	КОЛИЧЕСТВО(НомерДня1.cDate) КАК Номер
ПОМЕСТИТЬ НумерацияСтрок
ИЗ
	НомерДня КАК НомерДня
		ЛЕВОЕ СОЕДИНЕНИЕ НомерДня КАК НомерДня1
		ПО НомерДня.cDate >= НомерДня1.cDate
			И НомерДня.ProdiD = НомерДня1.ProdiD

СГРУППИРОВАТЬ ПО
	НомерДня.ProdiD,
	НомерДня.cDate,
	НомерДня.Количество,
	НомерДня.День
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	НумерацияСтрок.ProdiD КАК ProdiD,
	НумерацияСтрок.cDate КАК cDate,
	НумерацияСтрок.Количество КАК Количество,
	НумерацияСтрок.День КАК День,
	НумерацияСтрок.Номер КАК Номер,
	НумерацияСтрок1.День КАК День1,
	ВЫБОР
		КОГДА НЕ НумерацияСтрок1.День ЕСТЬ NULL
			ТОГДА ВЫБОР
					КОГДА НумерацияСтрок1.День = ДЕНЬ(&ДатаОкончания)
						ТОГДА НумерацияСтрок1.День - НумерацияСтрок.День + 1
					ИНАЧЕ НумерацияСтрок1.День - НумерацияСтрок.День
				КОНЕЦ
		ИНАЧЕ 0
	КОНЕЦ КАК КолДнейПериодОстатка
ПОМЕСТИТЬ ВрТч
ИЗ
	НумерацияСтрок КАК НумерацияСтрок
		ЛЕВОЕ СОЕДИНЕНИЕ НумерацияСтрок КАК НумерацияСтрок1
		ПО (НумерацияСтрок.Номер = НумерацияСтрок1.Номер - 1)
			И НумерацияСтрок.ProdiD = НумерацияСтрок1.ProdiD

СГРУППИРОВАТЬ ПО
	НумерацияСтрок.ProdiD,
	НумерацияСтрок.cDate,
	НумерацияСтрок.Количество,
	НумерацияСтрок.День,
	НумерацияСтрок.Номер,
	НумерацияСтрок1.День
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВрТч.ProdiD КАК ProdiD,
	ВрТч.cDate КАК cDate,
	ВрТч.Количество КАК Количество,
	ВрТч.День КАК День,
	ВрТч.Номер КАК Номер,
	ВрТч.День1 КАК День1,
	ВрТч.КолДнейПериодОстатка КАК КолДнейПериодОстатка,
	ВЫБОР
		КОГДА ВрТч.КолДнейПериодОстатка > 0
				И ВрТч.Количество > 0
			ТОГДА ВрТч.КолДнейПериодОстатка * ВрТч.Количество
		ИНАЧЕ 0
	КОНЕЦ КАК СуммаОстаткаПоПериоду
ПОМЕСТИТЬ ИтоговыеДанные
ИЗ
	ВрТч КАК ВрТч
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ИтоговыеДанные.ProdiD КАК ProdiD,
	СУММА(ИтоговыеДанные.СуммаОстаткаПоПериоду) КАК СуммаОстаткаПоПериоду
ПОМЕСТИТЬ СуммировалОстатки
ИЗ
	ИтоговыеДанные КАК ИтоговыеДанные

СГРУППИРОВАТЬ ПО
	ИтоговыеДанные.ProdiD
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СуммировалОстатки.ProdiD КАК ProdiD,
	СуммировалОстатки.СуммаОстаткаПоПериоду КАК СуммаОстаткаПоПериоду,
	ВЫРАЗИТЬ(СуммировалОстатки.СуммаОстаткаПоПериоду / ДЕНЬ(&ДатаОкончания) КАК ЧИСЛО(15, 2)) КАК aCount
ИЗ
	СуммировалОстатки КАК СуммировалОстатки

 

has been added to your cart:
Оформление заказа