воскресенье, 11 февраля 2018 г.

Запрос с нарастающим итогом

Запрос с нарастающим итогом рассмотрим на примере поступлений по регистру взаиморасчеты. Порядок решения:

  1. Нужно отобрать необходимые обороты (в данном случае "Приход") из регистра и поместить их во временную таблицу к которой будем обращаться.
  2. Выбрать 2 раза получившуюся таблицу и соединить по внутреннему соединению по необходимым полям и периоду через ">="
  3. Применить необходимую группировку
  4. Упорядочить по вкусу.
Результатом будет: 




Листинг решения:
ВЫБРАТЬ
ВзаиморасчетыОбороты.Период,
ВзаиморасчетыОбороты.Регистратор,
ВзаиморасчетыОбороты.Контрагент,
ВзаиморасчетыОбороты.СуммаПриход
ПОМЕСТИТЬ ВТ_Источник                         
ИЗ
РегистрНакопления.Взаиморасчеты.Обороты(, , Регистратор, ) КАК ВзаиморасчетыОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Источник.Период КАК Период,
ВТ_Источник.Регистратор,
ВТ_Источник.Контрагент КАК Контрагент,
ВТ_Источник.СуммаПриход,
СУММА(ВТ_Источник1.СуммаПриход) КАК СуммаНарастающегоИтога
ИЗ
ВТ_Источник КАК ВТ_Источник
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Источник КАК ВТ_Источник1
ПО ВТ_Источник.Период >= ВТ_Источник1.Период
И ВТ_Источник.Контрагент = ВТ_Источник1.Контрагент

СГРУППИРОВАТЬ ПО
ВТ_Источник.Период,
ВТ_Источник.Регистратор,
ВТ_Источник.Контрагент,
ВТ_Источник.СуммаПриход

УПОРЯДОЧИТЬ ПО
Контрагент,
Период 
Дополнение: 

В конкретном примере запрос может отрабатывать неправильно в случае если у регистратора будет совпадать время секунда в секунду в пределах группировки.

Фиксится данная проблема путем наложения более конкретного условия:


Если даты совпадают то происходит отработка по более конкретному условия - "МоментВремени" из регистратора.




 Листинг исправления:
ВЫБРАТЬ
ВзаиморасчетыОбороты.Период,
ВзаиморасчетыОбороты.Регистратор,
ВзаиморасчетыОбороты.Контрагент,
ВзаиморасчетыОбороты.СуммаПриход
ПОМЕСТИТЬ ВТ_Источник
ИЗ
РегистрНакопления.Взаиморасчеты.Обороты(, , Регистратор, ) КАК ВзаиморасчетыОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Источник.Период КАК Период,
ВТ_Источник.Регистратор,
ВТ_Источник.Контрагент КАК Контрагент,
ВТ_Источник.СуммаПриход,
СУММА(ВТ_Источник1.СуммаПриход) КАК СуммаНарастающегоИтога
ИЗ
ВТ_Источник КАК ВТ_Источник
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Источник КАК ВТ_Источник1
ПО (ВТ_Источник.Период > ВТ_Источник1.Период
ИЛИ ВТ_Источник.Период = ВТ_Источник1.Период
И ВТ_Источник.Регистратор.МоментВремени >= ВТ_Источник1.Регистратор.МоментВремени)
И ВТ_Источник.Контрагент = ВТ_Источник1.Контрагент

СГРУППИРОВАТЬ ПО
ВТ_Источник.Период,
ВТ_Источник.Регистратор,
ВТ_Источник.Контрагент,
ВТ_Источник.СуммаПриход

УПОРЯДОЧИТЬ ПО
Контрагент,
Период

Комментариев нет:

Отправить комментарий