我建议你专门建立一个“库存信息表”,里面包含产品id、进价、出价、仓存等信息,这个表与入仓记录、出仓记录分开。
比如:
入仓记录:
产品id     时间          数量     单价     类型
001        2002-11-20    200      100      入仓
001        2002-11-30    100      50       入仓每产生一笔入仓记录,就计算一下库存信息,如:
产品id     仓存     进价    出价    类型
001        300      50      50

解决方案 »

  1.   

    先谢谢一飞的建议, 但已经系统已经成形,要曾加一个表真的不可能 , 希望再帮帮手想想办法。入仓时有一个单价要求输入,所以
    --------------------------------------------------
    入仓表                                            |
    产品id     时间          数量     单价     类型    |
    001        2002-11-20    200      100      入仓   |
    --------------------------------------------------
    这样的纪录能顺利读取,但出仓时数据库的纪录为:
    --------------------------------------------------
    产品id     时间          数量     类型            |
    001        2002-11-20    200     出仓            |
    --------------------------------------------------没有单价,因为可能要求过几条入仓信息 计算出,如贴所讲
    提取产品数量来源于两批不同价格的同类产品时,要求加权计算
    提取时的单价, 所以希望能有更好的办法.
      

  2.   

    如果你只是想要出仓时的平均单价,你可以这样计算:select sum(单价 * (case 类型 when '入仓' then 数量 when '出仓' then -数量 end)) / sum((case 类型 when '入仓' then 数量 when '出仓' then -数量 end)) as 出仓单价
    from table_name;另外,根据你局的平均单价的例子,我认为这种计算方式应该是“加权平均法”,而不是“先进先出”法。如果是“先进先出”法,那么你的2002-12-1得出仓记录应该是2条记录,即:时间          数量     单价     类型
    2002-12-1     100      100      出仓 
    2002-12-1     100       50      出仓 
    也就是说,先前进的200件商品,由于还剩下100,因此这100应该先出仓,价格按照当时的价格100来计算,然后再把第二次进的100件商品出仓,价格采用第二次的价格。这是先进先出法的计算规则。而计算剩下的商品的平均价格,显然应该算作是“加权平均法”。
    欢迎探讨。
      

  3.   

    thanks ,我讲错了,就该是: 先进先出决定哪些产品出仓,而加权 是从先进先出后得出的几批产品中的价格的加权平均值 , 
    另外,出仓(H_info)入仓(R_info)为不同的表, 另外再有一个 仓库零细表(depot_info),H_info无单价,r_info有depot_info 记录该产品库存 (很有用的信息,可以确定从哪几批产品中提取)再举一次例子:
    原材料  A   设原来仓存为 0  
    入仓时间      数量     单价      仓存   
    2002-11-20    200      100      200
    2002-11-30    100      50       300则depot_info 库存为 300有两条出仓纪录
    出仓时间
    [1] 2002-11-25    100   depot_info 库存为 200     
    [2] 2002-12-1     200   depot_info 库存为 0出先进先出得 [1] 就从 11-20提取而11-20入仓的哪批产品足够满足[1]的数量,
    所以[1] 的单价= 11-20 入仓的单价= 100[2]出仓时, 先由先进先出得出要从11-20 提取 ,由于 [2]数量 > 11-20 数量,则11-20全部提取,并再向 12-30 提取直到满足 [2]的要求 .
    则 [2] 由先进先出得出要从两批入仓产品中提取,即你所说的 :时间          数量     单价     类型
    2002-12-1     100      100      出仓 
    2002-12-1     100       50      出仓 但就作为一条出仓纪录输出 ,即
    时间          数量     单价     类型
    2002-12-1     200      75     出仓 而75是从两批产品提取的殖民地数量 (100 + 100) 得出的加权平均单价 :
    (100(11-20的剩余数量) * 100 + 100 * 50 ) / (100+ 100)=75你所说的 sum() 计出来的单价就该就是
     (200(11-20的入仓数量) * 100 + 100 * 50 ) / 200 = 125我想求出出仓单价的步骤就该是 :
    查找库存数量 -> 确定该数量是从哪几批产品的入仓得到的 -> 从前面符合要求的最早的一批产品中提取,直到满足出仓数量 ,记录每批产品入仓单价及提取数量 
    -> 由提取数量及单价计得该批产品出仓时的单价 希望继续回复...
      

  4.   

    这个问题真是越来越有趣了,在下也作了好多年的批发/零售系统,非常喜欢这个关于业务方面的探讨。你说的问题,这次我明白了。上次我以为你的出入库记录都是放在一个表里,然后靠一个标识字段来区分出入库类型的呢。其实我上次的回复跟你的想法一样,也是“(100(11-20的剩余数量) * 100 + 100 * 50 ) / (100+ 100)=75
    ”,因为sum函数中有个case条件,如果类型是“出仓”,那么数量就取负值,最后的数量就是“剩余数量”。
    既然它放到了两个表里,我给你提个建议,因为我做的系统也有这个需求,我的基本设计思路与你类似,也是出仓、入仓分开,另外还有一个仓存表。但是我的入仓表比你多了一个关键的字段(当然,我的入仓表还有好多其他字段,但是与本题无关,此处省略)——“出仓数”,也就是每次出仓的时候,根据入仓时间采用先进先出算法的出本次出仓的数量需要算到那条入仓记录上,然后再记录上标明本次的“出仓数”,这样当下次再有出仓的时候,我只要读取入仓记录就可以确定从哪条入仓记录上出多少,而不需要每次都去出仓表中取数据再比较,而且出仓我使用了一个cursor,既然能够从入仓记录中得到本次的出仓数,而且单价是现成的,那么计算它的出库价格就很容易了,对吧?思路有了,我想具体算法应该不是很难了,这里就不写了,如果你确实需要,说一声,我再写给你。