[ОТВЕТИТЬ]
Опции темы
28.02.2013 10:31  
Mr_Vito
пытаюсь нарисовать отчетик для менеджеров
для подсчета оборачиваемости за период по товарам необходим средний остаток
отдельной таблички с остатками за каждый день в супермаге нет.
Наверняка с этой задачей сталкивались
Подскажите как проще это выдернуть? может функции готовые в супермаге есть?
 
28.02.2013 10:40  
Troll
Не понятно, что считать средним остатком. На утро или на вечер брать? При возникновении такой необходимости, я бы, например, стал джобом складывать остатки за день каким-то джобом в нужное время и потом бы с этой табличкой и работал. Все остальные способы с перерасчетами слишком сложны и ресурсоемки. Историю таблички можно заполнить расчетом до нужной даты.
 
28.02.2013 13:48  
Mtirt
А нельзя пойти обратным путем? Оборачиваемость, это вроде обратная величина от реализации, нет?
Может посчитать среднесуточную реализацию по дням недели, а уже от неё смотреть оборачиваемость?
 
28.02.2013 14:59  
bob
У нас для расчета оборачиваемости рассчитываются только остаток на начало, остаток на конец, приход и расход. Зачем нужен остаток на каждый день пока не совсем представляю. Может формулу в студию для обсуждения?
 
28.02.2013 15:25  
Shlong
Цитата:
Сообщение от bob
Может формулу в студию для обсуждения?
Думаю что формула типа: среднесуточный остаток делить на среднесуточную реализацию за период, все это и будет оборачиваемостью в днях.
 
01.03.2013 07:21  
Mr_Vito
да, верно
формула:

(остаток на 1-й день/2 +остатки за каждый день(кроме первого и последнего)+остаток на последний день периода/2)/реализацию за период
 
01.03.2013 07:58  
OlegON
Так на утро или на вечер остатки берутся?
 
01.03.2013 08:22  
Mr_Vito
утверждается, что все остатки на утро
 
06.03.2013 09:01  
Mr_Vito
пока считаю запросиком:

Код:
--средний остаток за переиод (01.01.2013 по 05.01.2013)
--остатки считаются на утро дня
-- формула ср.ост=(ост 1 день/2 + остатки на каждый день кроме первого и последнего 
--                 + ост на последний день/2)/количество дней в периоде

select loc, article, sum(ost)/(TO_DATE('05.12.2013', 'dd.mm.yyyy')-TO_DATE('01.12.2013', 'dd.mm.yyyy')+1) sumost 
from (
 select distinct saledate, loc, article, sum(q) over(partition by article, loc order by saledate) ost 
 from (
-- Остаток на первый день деленный на 2 (на утро 01.01.2013)
select TO_DATE('31.12.2012', 'dd.mm.yyyy') saledate, Article, Location loc, - SUM(Quantity)/2 q
from (   SELECT /*+ ORDERED USE_NL(S) INDEX(D SMDOCUMENTS_CREATEDAT) INDEX(S) */ L.ID Location, S.Article,
               SUM( S.Quantity * DECODE(L.ID,D.LocationTo,1,D.LocationFrom,-1,0)) Quantity 
         FROM SmDocuments D , SMStoreLocations L, SmSpec S
         WHERE D.DocType = S.DocType
           and D.ID = S.DocID
           and L.ID in (D.LocationTo,D.LocationFrom)
           and L.ID  not in (-1,1)
           and D.DocState >= 2
           and D.CreatedAt > to_date('31.12.2012','DD.MM.YYYY')
         GROUP BY L.ID, S.Article HAVING SUM( S.Quantity * DECODE(L.ID,D.LocationTo,1,D.LocationFrom,-1,0)) <> 0
       UNION ALL
         SELECT StoreLoc, Article, - Quantity
         FROM SMGoods
         WHERE Quantity <> 0 and StoreLoc  not in (-1,1) )
group by Location, Article having SUM(Quantity) <> 0
UNION ALL

-- остаток на каждый день, кроме первого и последнего (на утро 2,3,4)
select   d.saledate,  
           d.article,  
           decode(d.salelocationto, -2,  d.salelocationfrom,  d.salelocationto) loc, 
           sum(decode(d.salelocationto, -2,  -d.saleq, d.saleq)) q 
 from ffmaprep d
 where d.rectype=1 
   and d.saledate BETWEEN TO_DATE('01.01.2013', 'dd.mm.yyyy') and TO_DATE('03.01.2013', 'dd.mm.yyyy')
 group by d.saledate, d.article, d.salelocationfrom, d.salelocationto 
UNION ALL
select   d.saledate,  
           d.article,  
           decode(d.salelocationto, -2,  d.salelocationfrom,  d.salelocationto) loc, 
           sum(decode(d.salelocationto, -2,  -d.saleq, d.saleq)) q 
 from ffmaprep_ d
 where d.rectype=1 
   and d.saledate BETWEEN TO_DATE('01.01.2013', 'dd.mm.yyyy') and TO_DATE('03.01.2013', 'dd.mm.yyyy')
--   and decode(d.salelocationto, -2,  d.salelocationfrom,  d.salelocationto)=4 
--   and d.article ='02104' 
 group by d.saledate, d.article, d.salelocationfrom, d.salelocationto )
UNION ALL

--Остаток на последний день деленный на 2 (на утро 05.01.2013) 
select TO_DATE('04.12.2013', 'dd.mm.yyyy') saledate, Location loc, Article, - SUM(Quantity)/2 ost
from (   SELECT /*+ ORDERED USE_NL(S) INDEX(D SMDOCUMENTS_CREATEDAT) INDEX(S) */ L.ID Location, S.Article,
               SUM( S.Quantity * DECODE(L.ID,D.LocationTo,1,D.LocationFrom,-1,0)) Quantity 
         FROM SmDocuments D , SMStoreLocations L, SmSpec S
         WHERE D.DocType = S.DocType
           and D.ID = S.DocID
           and L.ID in (D.LocationTo,D.LocationFrom)
           and L.ID  not in (-1,1)
           and D.DocState >= 2
           and D.CreatedAt > to_date('04.01.2013','DD.MM.YYYY')
         GROUP BY L.ID, S.Article HAVING SUM( S.Quantity * DECODE(L.ID,D.LocationTo,1,D.LocationFrom,-1,0)) <> 0
       UNION ALL
         SELECT StoreLoc, Article, - Quantity
         FROM SMGoods
         WHERE Quantity <> 0 and StoreLoc  not in (-1,1) )
group by Location, Article having SUM(Quantity) <> 0
) group by loc, article
можно его оптимизировать или упростить?
 
07.03.2013 16:21  
Mr_Vito
не правильно считает :(
не учитывает дни, когда продаж не было
 
 


Опции темы



Часовой пояс GMT +3, время: 03:12.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.