Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) расчет нарастающего итога (число прочтений - 2901 )
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
расчет нарастающего итога
09. Июня 2009 :: 08:12
Печать  
помогите консультацией  Улыбка
имеем начальный остаток на самую раннюю дату, нужно
посчитать нач.ост для всех периодов для Кол и Сум.
какой из вариантов расчета нарастающего итога будет оптимальнее:

у меня есть такая таблица

Код
Выбрать все
TmpTable:
период    остатоккол    приходкол  расходкол   остатоксум   приходсум    расходсум
-------------------------------------------------
01.01.01      10          20          15            100         200          150
01.02.01                  30           5                        300          50
01.03.01                  10          20                        120          200

 



вариант расчета 1:
Код
Выбрать все
select
TmpTable.Период,
sum(iif(TmpTable.Период="+СтрДатаПериодаОстатков+",TmpTable.ОстатокКол,
t1.ОстатокКол+t1.ПриходКол-t1.РасходКол)) КоличествоНачальныйОстаток,

sum(iif(TmpTable.Период="+СтрДатаПериодаОстатков+",TmpTable.ОстатокСум,
t1.ОстатокСум+t1.ПриходСум-t1.РасходСум)) СуммаНачальныйОстаток

from TmpTable
left join TmpTable t1 on t1.Период<TmpTable.Период
group by TmpTable.Период
 



вариант расчета 2:
Код
Выбрать все
select
TmpTable.Период,

iif(TmpTable.Период="+СтрДатаПериодаОстатков+",
TmpTable.ОстатокКол,
( select sum(t1.ОстатокКол + t1.ПриходКол - t1.РасходКол)
from TmpTable t1 where t1.Период<TmpTable.Период )
) КоличествоНачальныйОстаток,

iif(TmpTable.Период="+СтрДатаПериодаОстатков+",
TmpTable.ОстатокСум,
( select sum(t1.ОстатокСум + t1.ПриходСум - t1.РасходСум)
from TmpTable t1 where t1.Период<TmpTable.Период )
) СуммаНачальныйОстаток
from TmpTable
 



или м.быть еще еще более красивый способ ??
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: расчет нарастающего итога
Ответ #1 - 09. Июня 2009 :: 08:46
Печать  
Не знаю прокатит ли это для dbf, для sql вот примеры
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: расчет нарастающего итога
Ответ #2 - 09. Июня 2009 :: 08:51
Печать  
Я пользовал левое соединение, показалось удобнее модифицировать
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #3 - 09. Июня 2009 :: 08:51
Печать  
alexdd писал(а) 09. Июня 2009 :: 08:46:
Не знаю прокатит ли это для dbf, для sql вот примеры


ну да, я там тож был - и оба варианта оттуда. Только у меня ресурсов несколько нужно рассчитывать
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #4 - 09. Июня 2009 :: 08:57
Печать  
Вадимко писал(а) 09. Июня 2009 :: 08:51:
Я пользовал левое соединение, показалось удобнее модифицировать


а по скорости отличаются ?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: расчет нарастающего итога
Ответ #5 - 09. Июня 2009 :: 10:46
Печать  
Для ДБФ запросом - что то мне подсказывает - будут редкие тормоза

В Индексированной - не проще сделать?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: расчет нарастающего итога
Ответ #6 - 09. Июня 2009 :: 17:11
Печать  
kiruha писал(а) 09. Июня 2009 :: 10:46:
Для ДБФ запросом - что то мне подсказывает - будут редкие тормоза

да кстати, и для sql такие штуки лучше делать на клиенте уже при выводе отчета(если это, конечно, для отчета).
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #7 - 09. Июня 2009 :: 18:36
Печать  
да нет, признаюсь, это для вт $РегистрОстаткиОбороты
- аналог для ДБФ.

kiruha, а хранимая процедура не улучшит картину ?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: расчет нарастающего итога
Ответ #8 - 09. Июня 2009 :: 19:16
Печать  
ol писал(а) 09. Июня 2009 :: 18:36:
да нет, признаюсь, это для вт $РегистрОстаткиОбороты
- аналог для ДБФ.

kiruha, а хранимая процедура не улучшит картину ?


Улучшит. Результат запроса в курсор и этот курсор обрабатывать как ТЗ.
Только смысл в чем ?
Ведь ИТ делает тоже самое. Скорость сравнима.

В вт $РегистрОстаткиОбороты вроде нарастающий итог не нужен
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #9 - 09. Июня 2009 :: 19:22
Печать  
в итоге измерения показали довольно приемлимые результаты:

время СоздатьВременнуюТаблицу: 12271
(это выполняется запрос без фильтров по регистру (остатки и обороты))
Период 01.01.08 - 30.04.09
Периодичность - месяц.
получается таблица строк: 25654

время расчета нар.итога: 3391
по вариантам мало отличается;
первый имеет преимущество, что более удобен для восприятия и модификаций.

  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #10 - 09. Июня 2009 :: 19:43
Печать  
kiruha писал(а) 09. Июня 2009 :: 19:16:
ol писал(а) 09. Июня 2009 :: 18:36:
да нет, признаюсь, это для вт $РегистрОстаткиОбороты
- аналог для ДБФ.

kiruha, а хранимая процедура не улучшит картину ?


Улучшит. Результат запроса в курсор и этот курсор обрабатывать как ТЗ.
Только смысл в чем ?
Ведь ИТ делает тоже самое. Скорость сравнима.

В вт $РегистрОстаткиОбороты вроде нарастающий итог не нужен


нарастающий итог там считается для заданной периодичности.
и в изначальной вт тоже в этом случае используется временная таблица.
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #11 - 09. Июня 2009 :: 19:45
Печать  
а для вт - я могу только предоставить парсированный текст + созданные вспомогательные таблицы/курсоры; ИТ я не могу использовать в этом случае
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #12 - 09. Июня 2009 :: 19:53
Печать  
мда, тормоза начинаются, когда выставляю все измерения в вт:

время СоздатьВременнуюТаблицу: 16003, строк: 117011
время расчета нар.итога: 12102

уже медленно.
попробую прикрутить индексы к временной таблице.
Видимо уж завтра
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: расчет нарастающего итога
Ответ #13 - 10. Июня 2009 :: 07:37
Печать  
ol писал(а) 09. Июня 2009 :: 08:57:
Вадимко писал(а) 09. Июня 2009 :: 08:51:
Я пользовал левое соединение, показалось удобнее модифицировать


а по скорости отличаются ?


не проверял честно говоря  Подмигивание
на глаз - быстро, соединение не по индексированным полям
данных всего несколько тысяч записей
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: расчет нарастающего итога
Ответ #14 - 10. Июня 2009 :: 08:14
Печать  
Вадимко писал(а) 10. Июня 2009 :: 07:37:
ol писал(а) 09. Июня 2009 :: 08:57:
Вадимко писал(а) 09. Июня 2009 :: 08:51:
Я пользовал левое соединение, показалось удобнее модифицировать


а по скорости отличаются ?


не проверял честно говоря  Подмигивание
на глаз - быстро, соединение не по индексированным полям
данных всего несколько тысяч записей


ну да, я уж выложил результаты; скорость выполнения на глаз пропорциональна размеру временной таблицы. вот думаю, удовлетворит или нет.

Создание индексов не помогает
здесь уже снова просить консультацию у Кирилла  Улыбка

действую так:
Код
Выбрать все
ЗапросОлеДБ.Выполнить("EXECSCRIPT('INDEX ON dtos(TmpTable.Период)+TmpTable.Номенклатура TAG Пер ')");
 



а затем

Код
Выбрать все
select
TmpTable.Номенклатура,
TmpTable.Период,
статок,
t1.КоличествоНачальныйОстаток+t1.КоличествоПриход-t1.КоличествоРасход)) КоличествоНачальныйОстаток,

from TmpTable
left join TmpTable t1 on dtos(t1.Период)+t1.Номенклатура<dtos(TmpTable.Период)+TmpTable.Номенклатура
group by ...
 



уходит в задумчивость ~40 c

Код
Выбрать все
select
TmpTable.Номенклатура,
TmpTable.Период,
статок,
t1.КоличествоНачальныйОстаток+t1.КоличествоПриход-t1.КоличествоРасход)) КоличествоНачальныйОстаток,

from TmpTable
left join TmpTable t1 on dtos(t1.Период)+t1.Номенклатура<dtos(TmpTable.Период)+TmpTable.Номенклатура
group by ...
 



тогда как в этом же запросе соединение

Код
Выбрать все
left join TmpTable t1 on t1.Период<TmpTable.Период
and t1.Номенклатура=TmpTable.Номенклатура
 



отрабатывает меньше секунды
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать