• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Как Добавить Периодичность В Запрос?

  • Автор темы AlenkaInt
  • Дата начала
A

AlenkaInt

Здравствуйте. Я сейчас обучаюсь в одной фирме франчайзи. Есть запрос в УТ 11, мне поставили задачу - надо выводить данные с периодичностью 1 день используя ТОЛЬКО физические таблицы. Подскажите, это надо как поработать с полем Период?
Вот, собственно, запрос:
ВЫБРАТЬ
КОЛИЧЕСТВО(ТоварыНаСкладах.Период) КАК Период,
ТоварыНаСкладах.Номенклатура КАК Товар,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Приход,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Расход
ПОМЕСТИТЬ Обороты
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Товар,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ - ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Остаток
ПОМЕСТИТЬ НачальныеОстатки
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) КАК НачОстаток,
ЕСТЬNULL(Обороты.Приход, 0) КАК Приход,
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) + ЕСТЬNULL(Обороты.Приход, 0) - ЕСТЬNULL(Обороты.Расход, 0) КАК КонОстаток,
ЕСТЬNULL(Обороты.Расход, 0) КАК Расход
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ НачальныеОстатки КАК НачальныеОстатки
ПО Номенклатура.Ссылка = НачальныеОстатки.Товар
ЛЕВОЕ СОЕДИНЕНИЕ Обороты КАК Обороты
ПО Номенклатура.Ссылка = Обороты.Товар

УПОРЯДОЧИТЬ ПО
Наименование
 
U

unknown181538

Например использовать выражение
НАЧАЛОПЕРИОДА(Регистер.Период,День) КАК День
 
A

AlenkaInt

Скажите, а можно эту функцию использовать в конструкторе запросов или это нужно уже в готовом запросе применять? Я нашла поиском много вариантов с кусками кода, но не знаю как и куда это вставить.
 
A

AlenkaInt

Сделала по вашему совету. Вот какой получился запрос.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК Период,
ТоварыНаСкладах.Номенклатура КАК Товар,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Приход,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Расход
ПОМЕСТИТЬ Обороты
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура,
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Товар,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ - ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Остаток
ПОМЕСТИТЬ НачальныеОстатки
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) КАК НачОстаток,
ЕСТЬNULL(Обороты.Приход, 0) КАК Приход,
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) + ЕСТЬNULL(Обороты.Приход, 0) - ЕСТЬNULL(Обороты.Расход, 0) КАК КонОстаток,
ЕСТЬNULL(Обороты.Расход, 0) КАК Расход,
Обороты.Период КАК Период
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ НачальныеОстатки КАК НачальныеОстатки
ПО Номенклатура.Ссылка = НачальныеОстатки.Товар
ЛЕВОЕ СОЕДИНЕНИЕ Обороты КАК Обороты
ПО Номенклатура.Ссылка = Обороты.Товар
ГДЕ
(НЕ Номенклатура.ЭтоГруппа)
В результате получается вот что.
Период Наименование НачОстаток Приход Расход КонОстаток
02.04.2010 0:00:00 BOSCH 9 3 6
01.04.2010 0:00:00 BOSCH 9 8 1
31.03.2010 0:00:00 BOSCH 9 21 1 29
03.04.2010 0:00:00 Ассорти 374 180 132 422
31.03.2010 0:00:00 Ассорти 374 94 4 464
05.04.2010 0:00:00 Ассорти 374 420 272 522
02.04.2010 0:00:00 Ассорти 374 420 410 384
Т.е. получилось, что отчет выводится по номенклатуре. Сначало по датам на одну номенклатуру, потом на другую номенклатуру. А мне надо, чтобы например 31.03 далее какие движения на это день, далее 01.04 и какие операции были в этот день. Как это сделать?
 
A

AlenkaInt

Я упорядочиваю по полю период по возрастанию. Но почему то числа идут не по порядку. Сначало 04.04, потом 03.04, 02.04, 01.04, 31.03, 29.03, 08.04, 07.04... Не понятно почему.
Вот какой получился запрос:

ВЫБРАТЬ
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Приход,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Расход,
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК Период
ПОМЕСТИТЬ Обороты
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Товар,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ - ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Остаток
ПОМЕСТИТЬ НачальныеОстатки
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) КАК НачОстаток,
ЕСТЬNULL(Обороты.Приход, 0) КАК Приход,
ЕСТЬNULL(Обороты.Расход, 0) КАК Расход,
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) + ЕСТЬNULL(Обороты.Приход, 0) - ЕСТЬNULL(Обороты.Расход, 0) КАК КонОстаток,
Обороты.Период КАК Период
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ НачальныеОстатки КАК НачальныеОстатки
ПО Номенклатура.Ссылка = НачальныеОстатки.Товар,
Обороты КАК Обороты
ГДЕ
(НЕ Номенклатура.ЭтоГруппа)
УПОРЯДОЧИТЬ ПО
Период
 
U

unknown181538

Есть запрос в УТ 11, мне поставили задачу - надо выводить данные с периодичностью 1 день используя ТОЛЬКО физические таблицы.
Это чисто учебная задача? Почему физические?
Посмотрел запрос. Замечу, что во второй таблице получаются остатки не начальные, а конечные, т.к. вы берете все движения. Берите до даты начала отчета.
В третьем пакете вообще лажа. Т.к. в с таблицей "Обороты" не определены связи, и получается Декартово произведение.
Да и остатки должны на каждый день получаться. А у вас, если брать день из серединки, будет получаться начальный остаток + оборот за этот день. Т.е. предыдущие дни от начала отчета не будут учитываться.

Поэтому ... может быть предложить что-то вроде: сначала получить обороты по дням и соединить их с таблицей движений условием
Обороты.Период>ДвиженияРегистра.Период
И Обороты.Номенклатура = ДвиженияРегистра.Номенклатура
. Сгруппировать, где поля оборотов будут группировками, а движения суммироваться.

Хотя лучше получить так же таблицу оборотов и, соединяя ее саму с собой, получать накопительный итог:
ВЫБРАТЬ
Обороты.Номенклатура,
Обороты.Период,
Обороты.Приход,
Обороты.Расход,
СУММА(Обороты2.Приход - Обороты2.Расход) КАК НачОст
Из Обороты КАК Обороты
Левое Соединение
Обороты Как Обороты2
По обороты.Номенклатура = Обороты2.Номенклатура
И Обороты.Период>Обороты2.Период
СГРУППИРОВАТЬ ПО Обороты.Номенклатура, Обороты.Приход, Обороты.Расход,Обороты.Период


Очень суровая задача для начинающего, имхо.
 
A

AlenkaInt

Это чисто учебная задача. Наверное для того, чтобы я лучше разобралась с РН. Да, с начальными остатками согласна не правильно, надо получать начальные остатки в самой выборке (в том периоде который я вывожу, другими словами "по-дням"), естественно это не просто Приход-Расход, еще по дням суммировать надо нарастающим итогом. Но как это реализовать я не знаю. Я решила по порядку, сначало сделать периодичность в день. А потом подумать о начальных остатках. Да, почему то в третье таблице нет связи по таблице Оборот. Но она была, видимо когда пробовала решить она стерлась.
Вот этот ваш код

ВЫБРАТЬ
Обороты.Номенклатура,
Обороты.Период,
Обороты.Приход,
Обороты.Расход,
СУММА(Обороты2.Приход - Обороты2.Расход) КАК НачОст
Из Обороты КАК Обороты
Левое Соединение
Обороты Как Обороты2
По обороты.Номенклатура = Обороты2.Номенклатура
И Обороты.Период>Обороты2.Период
СГРУППИРОВАТЬ ПО Обороты.Номенклатура, Обороты.Приход, Обороты.Расход,Обороты.Период
Куда его надо вставить?
 
A

AlenkaInt

В третьем запросе я решила не пользоваться Справочником Номенклатура и соединить первые 2 временные таблицы по полю номенклатура. Вроде получилось нормально, данные выводятся по дням.
Вот запрос:
ВЫБРАТЬ
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Приход,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Расход,
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК Период,
ТоварыНаСкладах.Номенклатура
ПОМЕСТИТЬ Обороты
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ),
ТоварыНаСкладах.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Товар,
СУММА(ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ - ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ТОГДА ТоварыНаСкладах.ВНаличии
ИНАЧЕ 0
КОНЕЦ) КАК Остаток
ПОМЕСТИТЬ НачальныеОстатки
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) КАК НачОстаток,
ЕСТЬNULL(Обороты.Приход, 0) КАК Приход,
ЕСТЬNULL(Обороты.Расход, 0) КАК Расход,
ЕСТЬNULL(НачальныеОстатки.Остаток, 0) + ЕСТЬNULL(Обороты.Приход, 0) - ЕСТЬNULL(Обороты.Расход, 0) КАК КонОстаток,
Обороты.Период КАК Период,
НачальныеОстатки.Товар
ИЗ
НачальныеОстатки КАК НачальныеОстатки
ПОЛНОЕ СОЕДИНЕНИЕ Обороты КАК Обороты
ПО НачальныеОстатки.Товар = Обороты.Номенклатура

УПОРЯДОЧИТЬ ПО
Период
Но вот как посчитать начальные остатки.. И где это лучше делать? Во временной таблице Начальные Остаки?
 
U

unknown181538

Я ж написал два варианта. Первый запрос пакета по получению оборота оставляете свой. А второй - берете один из моих.
 
A

AlenkaInt

Большое спасибо за помощь! Вы очень помогли!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!