Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает нарастающий итог, в чём дело? / 17 сообщений из 17, страница 1 из 1
15.12.2016, 15:40
    #39367865
Rust_Cohle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
День добрый, товарищи!
Имеется задачка на ABC-анализ.
Есть две таблицы. См. вложение эксель.
Первая таблица содержит справочную информацию(категория, продукт, цена)
Вторая таблица содержит информацию непосредственно о всех продажах за период. То-есть для моей задачи первая таблица нужна только для того чтобы выдрать оттуда цену, для расчета оборотов(PRICE*SALES_QNTY - цена*кол-во_товаров), и дальнейшего АБЦ-анализа.
Мой запрос сейчас выглядит вот так.
:Select
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Select LEFT(s.month,4) as year, s.store_format, s.product, s.SALES_QNTY as 'Кол-во продаж'
--,sum(s.SALES_QNTY) over() as 'Продано товаров'
--,100. *s.SALES_QNTY/sum(s.SALES_QNTY) over() as 'Доля товаров'
--,100. *sum(ss.SALES_QNTY)/sum(s.SALES_QNTY) over() as 'Доля товаров нараст'
,price*s.SALES_QNTY as 'Прибыль'
,100. *price*s.SALES_QNTY/sum(price*s.SALES_QNTY) over() as 'Доля прибыли'
,100. *sum(price*ss.SALES_QNTY)/sum(price*s.SALES_QNTY) over() as 'Доля прибыли нарастающ'
,case 
	when 100. *sum(ss.SALES_QNTY)/sum(s.SALES_QNTY) over() > 95  then 'C'
	when 100. *sum(ss.SALES_QNTY)/sum(s.SALES_QNTY) over() > 80  then 'B'
	else 'A'
end as ABC_QNTY
,case
	when 100. *sum(price*ss.SALES_QNTY)/sum(price*s.SALES_QNTY) over() > 95  then 'C'
	when 100. *sum(price*ss.SALES_QNTY)/sum(price*s.SALES_QNTY) over() > 80  then 'B'
	else 'A'
end as ABC_RUB

	from sale s, sale ss, sprav sp
	where 
	ss.SALES_QNTY>=s.SALES_QNTY and 
	sp.PRODUCT=s.PRODUCT 
	group by LEFT(s.month,4), s.store_format, s.product, s.SALES_QNTY,price
	--order by 'Доля товаров' desc
	order by 'Прибыль' desc



Во втором кейсе как раз должен происходить АБЦ-анализ по обороту в рублях. Он работает некорректно, так как я не могу построить нарастающий итог по столбцу 'Доля прибыли нарастающ'.
Первый же кейс, где происходит АБЦ-анализ по обороту в штуках(затронута всего 1 таблица), нарастающий итог работает прекрасно, если раскоментировать "--order by 'Доля товаров' desc".

Подскажите плиз, где ошибка?
...
Рейтинг: 0 / 0
15.12.2016, 15:55
    #39367892
Не работает нарастающий итог, в чём дело?
Rust_Cohle,

Для того, чтобы посчитать нарастающий итог, надо понимать в каком порядке его наращивать.
...
Рейтинг: 0 / 0
15.12.2016, 15:58
    #39367897
Rust_Cohle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Дело в сортировке,
вторая строка=вторая+первая, третья=третья+вторая+первая и т д. Стандартный нарастающий итог.
...
Рейтинг: 0 / 0
15.12.2016, 16:00
    #39367900
ORA__SQL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Rust_Cohle Дело в сортировке,
вторая строка=вторая+первая, третья=третья+вторая+первая и т д. Стандартный нарастающий итог.У строк нет порядка, пока ты его сам явно не задашь
...
Рейтинг: 0 / 0
15.12.2016, 16:07
    #39367913
помогу
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Rust_Cohle,

сделаю за деньги.


Почта: sqlhelper2@gmail.com
...
Рейтинг: 0 / 0
15.12.2016, 16:08
    #39367916
Rust_Cohle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
ORA__SQL,
Ну вот смотрите, Выводимый столбец 'Доля прибыли' Идет корректно по убыванию, сумма всех строк по нему составляет 100%. Я далее хочу вывести нарастающий итог этой Доли прибыли(по той же аналогии, что и Долей товаров). Но в отличии от второго, нарастающий итог выводит хрень, начиная вообще со 171%, местами за 200.
...
Рейтинг: 0 / 0
15.12.2016, 16:13
    #39367923
Не работает нарастающий итог, в чём дело?
Вместо over() в запросе укажи over(order by <Критерий_нарастания_итога>)
...
Рейтинг: 0 / 0
15.12.2016, 16:17
    #39367929
помогу
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Дело в сортировке, руки прочь от моего клиента!
...
Рейтинг: 0 / 0
15.12.2016, 16:23
    #39367935
Не работает нарастающий итог, в чём дело?
помогу, ты ему потом поможешь еще один этаж достроить. Мои интересы дальше сортировки не распространяются.
...
Рейтинг: 0 / 0
15.12.2016, 16:28
    #39367941
помогу
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Дело в сортировке,

хорошо, тебе за сортировку полагается 10% от стоимости заказа.
...
Рейтинг: 0 / 0
15.12.2016, 16:46
    #39367962
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Rust_Cohle,

ORDER BY селекта не распространяется как ORDER BY аналитических функций. Он должeн бть задан явно иначе вычисляется значение для всего окна. Посколько в селекте order by price*s.SALES_QNTY, то прeдположу:

Код: plsql
1.
,100. *sum(price*ss.SALES_QNTY)/sum(price*s.SALES_QNTY) over(order by price*s.SALES_QNTY) as 'Доля прибыли нарастающ'



SY.
...
Рейтинг: 0 / 0
15.12.2016, 18:05
    #39368046
Rust_Cohle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
SY,

чёт если я начинаю использовать order by аналитической функции(какие угодно поля перепробовал) заместо общего order by, у меня начинает рушиться весь запрос. Но ведь почему же, когда я считаю тем же способом доли товаров - все работает.(естественно меняя общий ордер бай). Кстати прошу обратить внимание на условие в поле where, именно благодаря ему у меня и идет нарастающий итог по товарам.
...
Рейтинг: 0 / 0
16.12.2016, 12:58
    #39368548
Rust_Cohle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Кароче, я сам разобрался. Выкладываю готовый рабочий вариант БЕСПЛАТНО, может кому поможет. А то смотрю бизнесменов развелось вокруг.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Select 
t.year
,t.store_format
,t.category
,t.product
--,SALES_QNTY
--,t.Dolya_Tovarov
--,100. *t.Summa_prodazh/t.VSEGO_PRODAZH as procent_qnty
--,t.ranks_ABC_QNTY
      ,case
			when 100. *t.Summa_prodazh/t.VSEGO_PRODAZH < 80 then 'A'
			when 100. *t.Summa_prodazh/t.VSEGO_PRODAZH between 80 and 95 then 'B'
      else 'C' end as ABC_QNTY
--,t.Dolya_Pribili
--,100. *t.Summa_pribili/t.VSEGO_PRIBIL as procent_rub
--,t.ranks_ABC_RUB
	   ,case
			when 100. *t.Summa_pribili/t.VSEGO_PRIBIL < 80 then 'A'
			when 100. *t.Summa_pribili/t.VSEGO_PRIBIL between 80 and 95 then 'B'
      else 'C' end as ABC_RUB
from (SELECT	LEFT(month,4) as year, s.store_format, sp.category, s.product
				,SALES_QNTY
				,100. *SALES_QNTY/sum(SALES_QNTY) over() as Dolya_Tovarov
				,sum(SALES_QNTY) over(order by SALES_QNTY DESC) as Summa_prodazh
				,rank() over(order by SALES_QNTY DESC) as ranks_ABC_QNTY
				,sum(SALES_QNTY) over() as VSEGO_PRODAZH
				,100. *PRICE*SALES_QNTY/sum(PRICE*SALES_QNTY) over() as Dolya_Pribili
				,sum(PRICE*SALES_QNTY) over(order by PRICE*SALES_QNTY DESC) as Summa_pribili
				,rank() over(order by PRICE*SALES_QNTY DESC) as ranks_ABC_RUB
				,sum(PRICE*SALES_QNTY) over() as VSEGO_PRIBIL
       FROM  sale s left join sprav sp ON sp.PRODUCT=s.PRODUCT
     ) as t
order by year


...
Рейтинг: 0 / 0
16.12.2016, 13:21
    #39368583
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Rust_Cohle,

авторVSEGO_PRIBIL да вы батенька маньяк


И на какой же версии Oracle это будет работать?
...
Рейтинг: 0 / 0
16.12.2016, 13:22
    #39368587
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Rust_CohleВыкладываю готовый рабочий вариант БЕСПЛАТНО, может кому поможет.Конечно заюзаем. Пример самый что ни на есть юзабельный. И схема данных описана, и постановка задачи, и наименование объектов стандартизованное - все мы такое используем. Просто бери запрос и копируй в свою систему - скомпилится без единой ошибки.

P.S. И еще, тут форум по ораклу, а запрос твой по ходу MS SQL-ный.
...
Рейтинг: 0 / 0
16.12.2016, 13:41
    #39368616
Rust_Cohle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
AmKad,
Человеку будет важна логика работы запроса, на основании которой он сделает свою задачу. А не под копирку мой вариант ;)
...
Рейтинг: 0 / 0
16.12.2016, 15:28
    #39368730
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает нарастающий итог, в чём дело?
Rust_Cohle,
ты правда считаешь что ты один такой умный?) это у тебя мозгов не хватило найти похожие темы на этом форуме. и твой запрос всего лишь еще один... в длинном ряду.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает нарастающий итог, в чём дело? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]