相关文章推荐

Oracle 加权平均库存计算。

ASKTOM 2019-03-06
826

问题描述

你好,
希望你身体健康最好。

我在微软视窗环境中工作,安装的数据库是甲骨文11gR2。
我有以下两个表与示例数据。

CREATE TABLE stock_master ( vno INTEGER, vdate DATE, vtype VARCHAR2(15) );


样本数据如下。

INSERT INTO stock_master  VALUES (1, '25-JAN-19', 'PURCHASE’ );
INSERT INTO stock_master  VALUES (2, '26-JAN-19', 'PURCHASE’ );
INSERT INTO stock_master  VALUES (3, '26-JAN-19', 'SALE’ );
INSERT INTO stock_master  VALUES (4, '27-JAN-19', 'SALE’ );
INSERT INTO stock_master  VALUES (5, '28-JAN-19', 'PURCHASE’ );
INSERT INTO stock_master  VALUES (6, '28-JAN-19', 'SALE’ );
CREATE TABLE stock_detail ( vd_no INTEGER, vno INTEGER, item_code VARCHAR2(8), qty NUMBER, rate NUMBER, vtype VARCHAR2(15) );
INSERT INTO stock_detail  VALUES (1, 1, '001001’, 10, 100 );
INSERT INTO stock_detail  VALUES (2, 2, '001001’, 50, 150 );
INSERT INTO stock_detail  VALUES (3, 3, '001001’, 15, 160 );
INSERT INTO stock_detail  VALUES (4, 4, '001001’, 5, 160 );
INSERT INTO stock_detail  VALUES (5, 5, '001001’, 10, 165 );
INSERT INTO stock_detail  VALUES (6, 6, '001001’, 50, 170 );


我的要求是从上面两个表创建视图,这些表将显示带有item_code的加权平均成本的日期明智的库存,如下所示:-

DATE ITEM_CODE QTY RATE AMOUNT QTY_IN_HAND AVG_RATE AVG_AMOUT VTYPE
25-Jan-19 001001 10 100 1000 10 100 1000 PURCHASE
26-Jan-19 001001 50 150 7500 60 141.6667 7083.335 PURCHASE
26-Jan-19 001001 15 160 2400 45 141.6667 6375.0015 SALE
27-Jan-19 001001 5 160 800 40 141.6667 5666.668 SALE
28-Jan-19 001001 10 165 1650 50 146.3334 7316.67 PURCHASE
28-Jan-19 001001 50 70 3500 0 146.3334 0 SALE


金额将按以下方式计算:-
金额 = 数量 * 费率

如果是首次购买,计算如下:
手中的数量 = 数量
平均费率 = 金额/数量
平均数量 = 手中的数量 * 平均比率

随后,在购买的情况下,将通过在运行余额中添加新购买的数量和金额来计算QTY_IN_HAND和avg_金额,如下所示:-
手数量 = 手数量
平均金额 = 平均金额
平均比率 = 平均比率/手中的数量

在销售的情况下,QTY_IN_HAND将通过减去销售数量来计算
手数量 = 手数量

但是,通过从 (数量 * avg_rate) 中减去运行的avg_moon,将减少avage_moon,如下所示:-
Avg _ 金额 = avg _ 金额-(数量 * avg _ 费率)

谢谢你的公式。但是我不明白您如何根据它们获得显示的平均费率/金额数字; 这些值似乎有一个循环定义。

不管怎样,要计算手头的数量,总结一下:

正购买数量
销售数量为负

这给出了

select m.*, d.qty, d.rate,
       sum (
         case when vtype = 'PURCHASE'
           then qty
           else -qty
       ) over ( 
         order by vdate, m.vno 
       ) qty_on_hand
from   stock_master m
join   stock_detail d
on     m.vno = d.vno;
VNO   VDATE                  VTYPE      QTY   RATE   QTY_ON_HAND   
    1 25-JAN-0019 00:00:00   PURCHASE      10    100            10 
    2 26-JAN-0019 00:00:00   PURCHASE      50    150            60 
    3 26-JAN-0019 00:00:00   SALE          15    160            45 
 
推荐文章