1. a3a 10 16.10.17 18:12 Сейчас в теме

Подскажите с расчетом таблиц в запросе

Коллеги подскажите пожалуйста. возникла необходимость достать таблицу запросом и рассчитать в ней определенную колонку. Вся проблема в том что в расчете задействованы значения предыдущей строки. т.е. у меня есть значения первой строки. что бы рассчитать последующие строки нужно брать цифры из предыдущих строк. Подскажите куда копать?

например пока сделал так: создал таблицу, продублировал, пронумеровал, соединил со смещением на 1 строку. НО таким образом у меня рассчитывается только вторая строка. что бы третью рассчитать нужно соединять опять. уже понимаю что неправильно. хотя бы вкратце подскажите направление. Заране спасибо.
Ответы
Избранное Подписка Сортировка: Древо
2. Goleff74 152 16.10.17 18:44 Сейчас в теме
(1)
ВЫЧИСЛИТЬВЫРАЖЕНИЕ("МояКолонка", , , "Предыдущая", "Предыдущая") + МояКолонка

Это в пользовательском поле, если что.

А если СКД использовать никак, то лефт джойн таблицы с самой собой с условиями по полям сортировки, расчет поля НомерПоПорядку, и еще один лефт джойн по НомерПоПорядку - 1.
4. NeviD 17.10.17 10:29 Сейчас в теме
(1) В запросе используем таблицу с номером строки.
Что-то наподобие такого:
ВЫБРАТЬ
ТЗ.НомерСтроки,
ТЗ.Реквизит1,
ТЗ.Реквизит2,
ТЗ.Сумма
ПОМЕСТИТЬ ТЗ
ИЗ ТЗ КАК ТЗ
;
ВЫБРАТЬ
ТЗ.НомерСтроки,
ТЗ.Реквизит1,
ТЗ.Реквизит2,
ТЗ.Сумма,
ТЗПредСтрока.Сумма КАК СуммаПредыдущейСтроки
ИЗ ТЗ КАК ТЗ
ЛЕВОЕ СОЕДИНЕНИЕ ТЗ КАК ТЗПредСтрока ПО ТЗ.НомерСтроки-1 = ТЗПредСтрока.НомерСтроки
Показать


У первой строки СуммаПредыдущейСтроки = NULL, у остальных значение Сумма предыдущей строки.
5. a3a 10 17.10.17 12:08 Сейчас в теме
(4)
предыдущей


я уже начинал делать так. но застрял. постараюсь описать задачу.

есть таблица по неделям.
так вот, формула первой недели отличается от последующих строк.
выявил первую неделю, поставил что ЭтоПерваяНеделя = Истина и расчитал без проблем. при соединении таблицы с самой собой со смещением на неделю я расчитал 2 строчку и все. получается что бы 3 строчку расчитать еще раз надо соединять? или как? Вот тут застрял.хотя могу просто тупить.
6. ildarovich 6718 17.10.17 12:45 Сейчас в теме
(5) Лучше объяснить задачу в точности, как она есть. Есть таблица по неделям...
- Первая колонка - дата или номер недели?
- Что во второй колонке?
- Сколько их всего?
- Формула первой недели: какая она? Формула второй, третьей недели и так далее. Чем больше подробностей, тем лучше.
Скорее всего, нужно что-то вроде "нарастающего итога", но лучше все же описать задачу поподробнее
7. a3a 10 17.10.17 18:15 Сейчас в теме
(6)

что то планирования продажи.

есть таблица:
первая колонка дата - т.е. на каждую строку это понедельник недели за определенный выбранный интервал. Например выбираем текущий день недели и указываем количество недель например 5. итого у нас 6 строк в таблице. Текущий понедельник + 5 понедельников вперед.

вторая колонка товар.
формула первой строки:
(Среднее значение продаж за 5 недель назад по текущему товару.) - Остатки по указанному товару на понедельник первой строки.

формула 2 и последующих строк:
(Среднее значение продаж за 5 недель назад (от понедельника 2 строки) по текущему товару.) - Остатки по указанному товару на понедельник предыдущей строки.
8. ildarovich 6718 17.10.17 19:19 Сейчас в теме
(7) То есть получается, что мы (по одному товару) знаем его текущий остаток на понедельник текущей недели и нам нужно построить график остатков товаров на несколько недель вперед. Остатки будут уменьшаться за неделю настолько, насколько в среднем в неделю их покупали за пять прошедших недель.
- Так?
То есть если на остатке 100 единиц, за пять недель купили 75 единиц (по 15 в неделю), то нужно получить ряд прогнозных остатков товаров 100, 85, 70, 55, 40, 25.
- Так?
- Ага, теперь понял, что среднее мы считаем в скользящем окне (от понедельника второй недели и так далее)... нет, снова не понял, понедельник второй строки он вроде бы в будущем. Откуда возьмутся продажи за пять недель? Их ведь всего теперь будет четыре?
Может, рисунок нарисовать? Вам самому-то задача понятна или так клиент объясняет?

В общем, лучше таблицу с примером расчета.

Запрос я напишу, он будет простым, но с пониманием задачи боюсь промахнуться.
9. a3a 10 17.10.17 20:11 Сейчас в теме
(8)
я пытался попроще описать, но кажется запутал больше.

)) все верно. скользящее окно. из вышеуказанных данных мы получается можем взять для 2 строки уже всего 4 недели. 1 неделю (будущие данные) мы заранее загружаем в регистр (своего рода планируемые продажи на 16 недель вперед). там так же указана дата - понедельник недели и количество планируемых продаж по данному товару. Так вот получается будущие данные мы берем из этого регистра.
в Итоге получается мы расчитываем данные по продажам из регистра продаж и планом продаж.
3. Dnki 4 16.10.17 20:29 Сейчас в теме
Я бы поступил просто:
- первым запросом собрал сведения. Результат выгрузил в ТЗ
- программно прошелся по ней и рассчитал нужную колонку.
- следующий запрос получил ТЗ и дальше выбирает, что нужно. Если нужна дальнейшая выборка, может предыдущего шага и достаточно.

Я напомню, что ОЗУ придумали именно для одновременного обращения к данным из разных мест. А файловые данные концептуально в момент времени читают один фрагмент данных. Проще говоря, головка диска находится над одним его участком (нынешние ССД) эмулируют тот-же подход. К чему я так долго: придумать запрос можно, но он противоречит самой архитектуре ЭВМ, значит будет долгим.
10. a3a 10 19.10.17 09:17 Сейчас в теме
например имеем таблицы в 10 строк. в 1 строке значение известно. допустим 2. каким образом для остальных строк можно прописать формулу + 3

Значение
1 строка 2 - заранее значем значение
2 строка 5 расчитываем + 3 к предыдущей строке
3 строка 8 расчитываем + 3 к предыдущей строке
4 строка 11 расчитываем + 3 к предыдущей строке
и т.д.
11. ildarovich 6718 19.10.17 12:45 Сейчас в теме
(10) Если я правильно понял задачу, то вся она решается вот таким запросом:
ВЫБРАТЬ
	ФактическиеПродажи.Период,
	ФактическиеПродажи.Номенклатура,
	ФактическиеПродажи.КоличествоОборот КАК Количество,
	ЛОЖЬ КАК План
ПОМЕСТИТЬ НедельныеПродажи
ИЗ
	РегистрНакопления.Продажи.Обороты(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, НЕДЕЛЯ, -&Окно), НЕДЕЛЯ), КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, НЕДЕЛЯ, -1), НЕДЕЛЯ), Неделя, ) КАК ФактическиеПродажи

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

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

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

СГРУППИРОВАТЬ ПО
	Периоды.Период,
	ТоварыНаСкладахОстатки.Номенклатура,
	ТоварыНаСкладахОстатки.КоличествоОстаток
Показать
Здесь в первом подзапросе объединяются фактические продажи по неделям за несколько (параметр &Окно) предшествующих Дата1 недель и плановые продажи по неделям с Дата1 по Дата2.
Во втором подзапросе происходит усреднение всех продаж (фактических и плановых) для каждого периода в окне, предшествующему этому периоду.
В третьем подзапросе складывается остаток и все расходы, начиная с Дата1 по ту неделю, на конец которой считается остаток. Нарастающий итог получается за счет того, что в первой строке учитываем расход за первую неделю, во второй - расход за первую и вторую неделю, в третьей - за первую, вторую и третью неделю и так далее.
То есть формула:
Х1 = Ост - Расход1
Х2 = Ост - Расход1 - Расход2
Х3 = Ост - Расход1 - Расход2 - Расход3 и так далее
Отсюда и получается реккурентная зависимость:
Х2 = Х1 - Расход2
Х3 = Х2 - Расход3 и так далее
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Программист 1С
Москва
зарплата от 130 000 руб. до 200 000 руб.
Полный день