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, время: 18:48.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.