Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Одним запросом LIFO/FIFO в Oracle  [new]
Relogin
Member

Откуда: Abhasia
Сообщений: 594
Допустим есть приход одного и того же товара на склад по разным ценам и расходы:
дата1 прих1 цена1
дата2 прих2 цена2
дата3 расх1 -
дата4 прих3 цена3
1) Требуется на любую заданную дату вычислить среднюю стоимость товара с учетом расхода по FIFO/LIFO.
2) Для заданного расхода показать проводки приходные, которые этот расход покрывают по методу FIFO/LIFO

Кто такое решал уже на Oracle ?

сахарочаепотреблялко
3 апр 09, 10:56    [7016013]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом LIFO/FIFO в Oracle  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Relogin,

я одну проблему вижу - производительность (если данных много и расчет проводить из глубины веков :)
в связи с этим - остатки обычно материализуют.
а написать - обычной аналитикой
3 апр 09, 11:20    [7016238]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом LIFO/FIFO в Oracle  [new]
Relogin
Member

Откуда: Abhasia
Сообщений: 594
В общем родилась такая примитивно-"сырая" первая версия будущего терминатора. :)
Показывает прих. проводки, количество которых участвует в проводке расхода на -13 единиц.
nadofrompro - это сколько единиц для расходной проводки требуется от данной приходной.
nakopitdelta - это сколько осталось гасить расходной проводки с учетом текущей и предыд. прих. проводок.

/*Недоделано*/

select   case
            when xall.nakopitdelta <= 0 then cntprih
            else cntprih - nakopitdelta
         end
            nadofrompro, xall.*
  from   (select   avg(x1rash.cnt)
                      over (
                         order by x2prih.ord
                         rows between unbounded preceding and current row
                      )
                      rashod,
                   avg(x1rash.cnt)
                      over (
                         order by x2prih.ord
                         rows between unbounded preceding and current row
                      )
                   + sum(x2prih.cntprih)
                        over (
                           order by x2prih.ord
                           rows between unbounded preceding and current row
                        )
                      nakopitdelta, /*x1rash.*,*/
                                    /*trunc(sum(x2prih.cntprih*x2prih.stoim) over (partition by null order by x2prih.ord rows between unbounded preceding and current row)/
                                    sum(cntprih) over (partition by null order by x2prih.ord rows between unbounded preceding and current row),2)
                                    avgstoim,*/
                                    x2prih.*
            from   (select   x1.ord,
                             case when x1.cnt < 0 then 0 else cnt end cntprih,
                             stoim
                      from   (select   1 ord, 5 cnt, 10 stoim from dual
                              union all
                              select   2 ord, 7 cnt, 20 stoim from dual
                              union all
                              select   3 ord, 10 cnt, 100 stoim from dual
                              union all
                              select   4 ord, 17 cnt, 100 stoim from dual
                              union all
                              select   5 ord, -8 cnt, null stoim from dual
                              union all
                              select   6 ord, 12 cnt, 50 stoim from dual
                              union all
                              select   7 ord, 22 cnt, 25 stoim from dual
                              union all
                              select   8 ord, 14 cnt, 15 stoim from dual) x1
                     where   x1.cnt > 0) x2prih,
                   (select   x1.*
                      from   (select   1 ord, 5 cnt, 10 stoim from dual
                              union all
                              select   2 ord, 7 cnt, 20 stoim from dual
                              union all
                              select   3 ord, 10 cnt, 100 stoim from dual
                              union all
                              select   4 ord, 17 cnt, 100 stoim from dual
                              union all
                              [color=red]select   5 ord, -13 cnt, null stoim from dual[/color]
                              union all
                              select   6 ord, 12 cnt, 50 stoim from dual
                              union all
                              select   7 ord, 22 cnt, 25 stoim from dual
                              union all
                              select   8 ord, 14 cnt, 15 stoim from dual) x1
                     where   x1.cnt < 0) x1rash
           where   x2prih.ord < 5 and x2prih.ord < x1rash.ord) xall
 where   xall.nakopitdelta <= 0
         or xall.nakopitdelta > 0 and xall.nakopitdelta < cntprih
/* Formatted on 3-апр-2009 12:35:30 (QP5 v5.120.811.25008) */
3 апр 09, 12:42    [7017053]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом LIFO/FIFO в Oracle  [new]
Relogin
Member

Откуда: Abhasia
Сообщений: 594
Странно тэги
select 5 ord, -13 cnt, null stoim from dual
внутри тэга SRC не сработали....
3 апр 09, 12:43    [7017063]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Одним запросом LIFO/FIFO в Oracle  [new]
РысЪ
Member

Откуда:
Сообщений: 21
Родился терминатор?
Возникла подобная же задача.
19 июн 12, 16:20    [12739881]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить