Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Среднее квадратичное отклонение по регистру продаж (число прочтений - 5120 )
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Среднее квадратичное отклонение по регистру продаж
11. Марта 2010 :: 11:06
Печать  
Нужно получить среднее квадратичное по регистру продаж по дням.
При установке периодичности "День" запрос учитывает только дни, в которые были продажи.
Помогите составить правильный запрос.
  

SKO.ert ( 49 KB | Загрузки )

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #1 - 11. Марта 2010 :: 12:21
Печать  
Или чего то намудрил или это я не правильно понял вопрос.

1.Расчитываешь среднюю продажу(СреднийОборот) в день за месяц. И количество дней продаж(n).
Думаю это просто.

2.В подзапросе получаешь таблицу с полями День и КоличествоОборотЗаДень  
потом получаешь
SUM((ВремТаблица.КоличествоОборотЗаДень - :СреднийОборот)* (ПродажиОбороты.КоличествоОборот - :СреднийОборот)) as КвОтклонение


3. потом квадратный корень из КвОтклонение/n - это и будет среднеквадратичное отклонение за месяц
все
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #2 - 11. Марта 2010 :: 12:35
Печать  
kiruha писал(а) 11. Марта 2010 :: 12:21:
Или чего то намудрил или это я не правильно понял вопрос.

1.Расчитываешь среднюю продажу(СреднийОборот) в день за месяц. И количество дней продаж(n).
Думаю это просто.

2.В подзапросе получаешь таблицу с полями День и КоличествоОборотЗаДень 
потом получаешь
SUM((ВремТаблица.КоличествоОборотЗаДень - :СреднийОборот)* (ПродажиОбороты.КоличествоОборот - :СреднийОборот)) as КвОтклонение


3. потом квадратный корень из КвОтклонение/n - это и будет среднеквадратичное отклонение за месяц
все

Как я понимаю на конкретном примере за 5 дней:
1 день - 2шт.
2 день - 3шт.
3 день - 0
4 день - 0
5 день - 0
-----------------
Среднее = 1
-----------------
Отклонение (Продажа - Среднее):
1
2
-1
-1
-1
---------------
Отклонение в квадрате:
1
4
1
1
1
--------------
Сумма отклонений:
8
--------------
СКО:
Корень из 8.
--------------
Вот мне нужно высчитать то же самое, только за год
по 24000 позиций.
Тут нужно как-то объединить таблицу всех дней периода
и продажи в эти дни...
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #3 - 11. Марта 2010 :: 13:03
Печать  
корень из 8/5.
Для несколько товаров алгоритм тот же, просто добавляется группировка по товару

Таблицу дней можно во временную таблицу , если есть пропуски продаж
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #4 - 11. Марта 2010 :: 13:12
Печать  
Хотя конечно 24 000 позиций на 250 раб дней - 6 млн промежуточная таблица
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #5 - 11. Марта 2010 :: 13:39
Печать  
А вообще по товарам статистику не считают.
Только по номенклатурным группам.

Например процессоры постоянно меняются, одни устаревают, на смену приходят другие
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #6 - 11. Марта 2010 :: 13:55
Печать  
al_zzz писал(а) 11. Марта 2010 :: 12:35:
kiruha писал(а) 11. Марта 2010 :: 12:21:
Или чего то намудрил или это я не правильно понял вопрос.

1.Расчитываешь среднюю продажу(СреднийОборот) в день за месяц. И количество дней продаж(n).
Думаю это просто.

2.В подзапросе получаешь таблицу с полями День и КоличествоОборотЗаДень  
потом получаешь
SUM((ВремТаблица.КоличествоОборотЗаДень - :СреднийОборот)* (ПродажиОбороты.КоличествоОборот - :СреднийОборот)) as КвОтклонение


3. потом квадратный корень из КвОтклонение/n - это и будет среднеквадратичное отклонение за месяц
все

Как я понимаю на конкретном примере за 5 дней:
1 день - 2шт.
2 день - 3шт.
3 день - 0
4 день - 0
5 день - 0
-----------------
Среднее = 1
-----------------
Отклонение (Продажа - Среднее):
1
2
-1
-1
-1
---------------
Отклонение в квадрате:
1
4
1
1
1
--------------
Сумма отклонений:
8
--------------
СКО:
Корень из 8.
--------------
Вот мне нужно высчитать то же самое, только за год
по 24000 позиций.
Тут нужно как-то объединить таблицу всех дней периода
и продажи в эти дни...

База sql ?
Сколько дней в периоде (году)
Это календарные дни или как то иначе ?
твой отчет не копировал.

Регистр продаж это оборотный рег Продаж из ТС или что-то иное.
Стоит ли галка отбор движений по измерению  номенклатура ?
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #7 - 12. Марта 2010 :: 04:35
Печать  
kiruha писал(а) 11. Марта 2010 :: 13:03:
корень из 8/5.
Для несколько товаров алгоритм тот же, просто добавляется группировка по товару

Таблицу дней можно во временную таблицу , если есть пропуски продаж

Верно. Я ошибся - корень из  8/5
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #8 - 12. Марта 2010 :: 04:41
Печать  
Z1 писал(а) 11. Марта 2010 :: 13:55:
База sql ?
Сколько дней в периоде (году)
Это календарные дни или как то иначе ?
твой отчет не копировал.

Регистр продаж это оборотный рег Продаж из ТС или что-то иное.
Стоит ли галка отбор движений по измерению  номенклатура ?

1. База sql.
2. Дни календарные, т.к. магазины работают без выходных
3. "Продажи" - оборотный регистр из ТиС, только добавлено одно измерение "Склад".
4. Галка "Отбор движений" по номенклатуре отсутствует.
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #9 - 12. Марта 2010 :: 04:46
Печать  
kiruha писал(а) 11. Марта 2010 :: 13:03:
Таблицу дней можно во временную таблицу , если есть пропуски продаж

Есть такая мысль. Если без группировки по номенклатуре, по одной позиции, то ещё как-то могу себе это представить. А по всей номенклатуре...
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #10 - 12. Марта 2010 :: 06:10
Печать  
1.Период может начинаться в одном году а заканчиваться в другом ?
2. Можешь сделать маленькую базу тестовую из 3 или 4 товаров
и выложить здесь ?
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #11 - 12. Марта 2010 :: 07:44
Печать  
Z1 писал(а) 12. Марта 2010 :: 06:10:
1.Период может начинаться в одном году а заканчиваться в другом ?
2. Можешь сделать маленькую базу тестовую из 3 или 4 товаров
и выложить здесь ?

Базу, к сожалению, не могу выложить. Но подойдет любая Тис7.7.
Сейчас уложил таблицу с днями в sql, получил продажи по дням, получил среднее значение с помощью  конструкции with rollup пока делаю только по одной позиции:
Код
Выбрать все
ТекстЗапроса = "-- qryMaker:Средняя продажа.2010.03.12.11.22.03
		|Select
		|   Dat1.Dat [Дата $Дата]
		|,  ТаблицаПродаж.Продажи
		|,  ТаблицаПродаж.Среднее
		|,  ТаблицаПродаж.Группировка
		|From #Dat_  As Dat1
		|Full Outer Join
		|(SELECT
		|     ПродажиОбороты.Период День
		|,    SUM(ПродажиОбороты.КоличествоОборот - ПродажиОбороты.КоличествоВОборот) Продажи
		|,    (SUM(ПродажиОбороты.КоличествоОборот - ПродажиОбороты.КоличествоВОборот)/DateDiff(day,:НачДата,:КонДата)) Среднее
		|,    Grouping(ПродажиОбороты.Период) Группировка
		|FROM $РегистрОбороты.Продажи(:НачДата,
		|		:КонДата,День,,
		|		(Номенклатура = :ВыбНом),,) AS ПродажиОбороты
		|GROUP BY ПродажиОбороты.Номенклатура, ПродажиОбороты.Период WITH ROLLUP) As ТаблицаПродаж
		|				    On Dat1.Dat = ТаблицаПродаж.День
		|";
 


Получил таблицу значений вида:
Код
Выбрать все
Дата	   | Продажи    |    Среднее | Группировка
".."			 4		  0.010989	    1
".."			 4		  0.010989	    1
"01.03.09"	   0		  0			   0
"02.03.09"	   0		  0			   0
"03.03.09"	   0		  0			   0
"04.03.09"	   0		  0			   0
----------------------------------------------------
 


Как из подзапроса получить значение Среднее
только при Группировка равной 1, чтоб у меня получилась таблица вида:
Код
Выбрать все
Дата	   | Продажи    |    Среднее | Группировка
"01.03.09"	   0		  0.010989	    0
"02.03.09"	   0		  0.010989	    0
"03.03.09"	   0		  0.010989	    0
"04.03.09"	   0		  0.010989	    0
----------------------------------------------------
 


  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #12 - 12. Марта 2010 :: 07:50
Печать  
( al_zzz )
про период не ответил
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #13 - 12. Марта 2010 :: 08:10
Печать  
Z1 писал(а) 12. Марта 2010 :: 07:50:
( al_zzz )
про период не ответил

В принципе, может. Задумано его рассчитывать ежемесячно за год по начало текущего месяца.
Код
Выбрать все
DateDiff(day,:НачДата,:КонДата) 

вроде бы нормально отрабатывает.
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Среднее квадратичное отклонение по регистру продаж
Ответ #14 - 12. Марта 2010 :: 11:06
Печать  
С rollup - ом ничего не получилось. Сделал по топорному:
Код
Выбрать все
ТекстЗапроса = "-- qryMaker:Средняя продажа.2010.03.12.11.22.03
		|Select
		|  Выборка.Kod
		|, Sum(Выборка.Продажи) Продажи
		|, Sum(Выборка.КвадратОтклонения)/DateDiff(day,:НачДата,:КонДата) КвадратОтклонения
		|From
		|(Select DISTINCT
		|   Ном.Code Kod
		|,  Dat1.Dat [Дата $Дата]
		|,  ТаблицаПродаж.Продажи
		|,  ТаблицаСреднего.Среднее Среднее
		|,  (ISNULL(ТаблицаПродаж.Продажи,0) - Cast(ТаблицаСреднего.Среднее As Numeric(15,5)))*
		|   (ISNULL(ТаблицаПродаж.Продажи,0) - Cast(ТаблицаСреднего.Среднее As Numeric(15,5))) КвадратОтклонения
		|--,  Grouping(Ном.Id) as Группировка
		|From $Справочник.Номенклатура As Ном
		|Full Outer Join #Dat_  As Dat1
		|				 On  1=1
		|Left Outer Join
		|(SELECT -- (*)
		|	ПродажиОбороты.Номенклатура
		|,     ПродажиОбороты.Период День
		|,    SUM(ПродажиОбороты.КоличествоОборот - ПродажиОбороты.КоличествоВОборот) Продажи
		|FROM $РегистрОбороты.Продажи(:НачДата,
		|		:КонДата,День,,
		|		--(Номенклатура = :ВыбНом)
		|	 ,,) AS ПродажиОбороты
		|GROUP BY ПродажиОбороты.Номенклатура, ПродажиОбороты.Период) As ТаблицаПродаж
		|				    On (Dat1.Dat = ТаблицаПродаж.День) And (ТаблицаПродаж.Номенклатура = Ном.Id)
		|Full Outer Join
		  |(SELECT ПродажиОбороты.Номенклатура -- (**)
		|,	  (SUM(ПродажиОбороты.КоличествоОборот - ПродажиОбороты.КоличествоВОборот) /
		|	DateDiff(day,:НачДата,:КонДата)) Среднее
		|-- ,    DateDiff(day,:НачДата,:КонДата) Дней
		|-- ,    SUM(ПродажиОбороты.КоличествоОборот - ПродажиОбороты.КоличествоВОборот) Продажи
		|FROM $РегистрОбороты.Продажи(:НачДата,
		|		:КонДата,,,
		|		(Номенклатура = :ВыбНом),,) AS ПродажиОбороты
		|GROUP BY ПродажиОбороты.Номенклатура) As ТаблицаСреднего
		|				    On (1=1) AND (ТаблицаСреднего.Номенклатура = Ном.Id)
		|Where (Ном.Id = :ВыбНом)
		|Group By Ном.Id, Ном.Code, Dat1.Dat, ТаблицаПродаж.Продажи, ТаблицаСреднего.Среднее) As Выборка
		|Group By Выборка.Kod
		|Order By Выборка.Kod
		|";
 


По одной позиции делается в районе 5 сек. Вот если бы можно было бы добавить итоги в  подзапрос (*) и из них получать среднюю продажу(с этой проблемой я не смог разобраться), тогда можно было бы получить прирост в скорости отказавшись от (**)...
Жду предложений по оптимизации!
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать