create table 库存表(
 商品类别   varchar(50),
 商品名称   varchar(50),
 商品规格   varchar(50),
 数量       int,
 单价       int,
 库存标志   char(10)
 
)
insert into 库存表 select 'a','a1','111',10,100,'入库'
insert into 库存表 select 'a','a1','111',10,100,'入库'
insert into 库存表 select 'a','a1','111',20,100,'入库'drop table 库存表
------------------------------------------------------------------------
请问这样的话出库时,用"加权平均法"计算出的出库单价是多少?
请给出sql语句.

解决方案 »

  1.   

    --這樣嗎?
    select 商品类别,商品名称,商品规格,sum(数量*单价)/sum(数量) as 價格 from 库存表 
    where 库存标志='入库'
    group by 商品类别,商品名称,商品规格
      

  2.   

    create table 库存表(
     商品类别   varchar(50),
     商品名称   varchar(50),
     商品规格   varchar(50),
     数量       int,
     单价       int,
     库存标志   char(10)
     
    )
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',20,100,'入库'
    insert into 库存表 select 'a','a1','111',5,(10*100+10*100+20*100)/(10+10+20)
    ,'出库'drop table 库存表
    ------------------------
    以上是按照楼上所说的方法出库了5个.如果再出库的话,该怎样计算出库单价
      

  3.   

    请教
    CSDMN(冒牌经理 V0.3)那该怎样用"加权平均发"得到"出库单价"呢
      

  4.   

    --估計樓主要的就是這樣的平均加權吧
    --tryselect 商品类别,商品名称,商品规格
    ,sum((case when 库存标志='入库' then 数量 else 0 end)*单价)/sum( case when 库存标志='入库' then 数量 when 库存标志='出库' then -数量 end) as 價格 
    from 库存表 
    group by 商品类别,商品名称,商品规格
      

  5.   

    playwarcraft(时间就像乳沟,挤挤还是有的)您好,其实我也不太懂财务上的成本核算,所以在这里向大家请教了要求是这样的:假如入库单价是这样insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,200,'入库'
    insert into 库存表 select 'a','a1','111',20,300,'入库'如果在出库的时候,不按照"先进先出"来做(先进先出太复杂了),而是按照"平均加权"
    该怎样计算出库单价,才能最后在成本核算的时候最接近"先进先出"得出的结果.
      

  6.   

    select avg(数量*单价) from 库存表
    想分组就进行分组。
      

  7.   

    Hopewell_Go(好的在后頭﹗希望更好﹗﹗) select avg(数量*单价) from 库存表
    想分组就进行分组。
    ----------------------------这里的数量是 "结存数量"还是"入库数量"?????
      

  8.   

    create table 库存表(
     商品类别   varchar(50),
     商品名称   varchar(50),
     商品规格   varchar(50),
     数量       int,
     单价       int,
     库存标志   char(10)
     
    )
    -->你这里不是一个“数量”吗,不太明白?说明白些。
      

  9.   

    Hopewell_Go(好的在后頭﹗希望更好﹗﹗) 
    -----------------------
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,200,'入库'
    insert into 库存表 select 'a','a1','111',20,300,'入库'
    这里入库了3笔数据,价格分别为100,200,300(同一种商品),现在要出库,要按照加权平均法
    出库,那么出库单价怎样计算?
      

  10.   

    --入库
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',20,100,'入库'
    出库
    insert into 库存表 select 'a','a1','111',5,(10*100+10*100+20*100)/(10+10+20)
    ,'出库'
    --我理解,要是再出库5,所等数据是不是
    insert into 库存表 select 'a','a1','111',,((10-5)*100+10*100+20*100)/(10+10+20)
    --再一次出库8:第一条已完成,再进行下一条数据
    insert into 库存表 select 'a','a1','111',8,(10*100+20*100)/(10+20)
    不知理解是不是?
      

  11.   

    Hopewell_Go(好的在后頭﹗希望更好﹗﹗) 
    ---------------------------
    谢谢,其实我不知道平均加权法怎样计算出库单价,所以在这里问大家,如果楼上做过财务软件请指点.
      

  12.   

    修改一下:
    --入库
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',20,100,'入库'
    出库
    insert into 库存表 select 'a','a1','111',5,(10*100+10*100+20*100)/(10+10+20)
    ,'出库'
    --我理解,要是再出库5,所等数据是不是
    insert into 库存表 select 'a','a1','111',,((10-5)*100+10*100+20*100)/((10-5)+10+20),'出库'
    --再一次出库8:第一条已完成,再进行下一条数据
    insert into 库存表 select 'a','a1','111',8,(10*100+20*100)/(10+20),'出库'
      

  13.   

    修改一下:
    --入库
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',20,100,'入库'
    出库
    insert into 库存表 select 'a','a1','111',5,(10*100+10*100+20*100)/(10+10+20)
    ,'出库'
    --我理解,要是再出库5,所等数据是不是
    insert into 库存表 select 'a','a1','111',,((10-5)*100+10*100+20*100)/((10-5)+10+20),'出库'
    --再一次出库8:第一条已完成,再进行下一条数据
    insert into 库存表 select 'a','a1','111',8,(10*100+20*100)/(10+20),'出库'
    -------------------------------------
    能给出计算出库单价的SQL吗?谢谢!!!!
      

  14.   

    另:楼主的例子举的例子很不恰当,因为所有的单价一样的,那按什么平均也都是一样的
    ---------------------------------------
    我后来改了insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,200,'入库'
    insert into 库存表 select 'a','a1','111',20,300,'入库'
    ----------------------------------------
    这里的1、2就是 本期入库的权--请解释一下
      

  15.   

    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,200,'入库'
    insert into 库存表 select 'a','a1','111',20,300,'入库'
    ------------------------------------------------------------
    如果按照以上数据,给出条件为按月进行平均加权计算
    那么出库单价公式该怎样写?
      

  16.   

    感觉LZ所说的问题是出库成本的计算,换言就是物料的计价方式,
    如果用加权平均,有2种:
    1、全月一次加权平均,2、移动加权平均
    --------------------------------------------------
    1、全月一次加权平均,是在月末计算物资的价格:
    价格 = (期初金额 + 本期入库金额)/(期初数量 + 本期入库数量)
    这个价格作为本期出库物资的价格,由于是在月末进行计算,所以价格有延迟,物资出库时会没有价格显示。
    2、移动加权平均,是在物资出库的时候进行计算的:
    价格 = (期初金额 + 本次出库前本期的所有入库金额)/(期初数量 + 本次出库前本期的所有 入库数量)
    这个价格作为本期出库物资的价格,价格是在及时进行计算,所以比较接近事实,但是对于没有来发票的物资,我们采用暂估的方式计价,如果暂估和来发票价格出入很大,会造成成本不实。
    -------------------------
    写完才发现,LZ的表怎么没有分开期初金额和发生额
    汗死…………
      

  17.   

    都没有时间数据。
    -------------------
    insert into 库存表 select 'a','a1','111',10,100,'入库','2006-1-1'
    insert into 库存表 select 'a','a1','111',10,200,'入库','2006-1-10'
    insert into 库存表 select 'a','a1','111',20,300,'入库','2006-1-20'
    -------------------------------------------------------------------
    加上时间数据该怎样做?
      

  18.   

    楼主有试过我上面给的方法吗??
    那个是所谓的平均加权法。如果楼主想要先进先出或者后进先出之类的算法,其实也很简单,加个入库时间栏位就可以了,
    参考以下帖子:
    http://community.csdn.net/Expert/topic/5021/5021336.xml?temp=.3696863
    http://community.csdn.net/Expert/topic/5022/5022260.xml?temp=.2556726
      

  19.   

    playwarcraft(时间就像乳沟,挤挤还是有的)
    ----------------------------
    对不起,刚才一直在回帖子,还没来得及试过你的方法多谢指点,我去看看
      

  20.   

    playwarcraft(时间就像乳沟,挤挤还是有的) 
    -----------------------------
    http://community.csdn.net/Expert/topic/5021/5021336.xml?temp=.3696863这个帖子的方法,好像再增加入库数据的时候,就会有问题
      

  21.   

    CSDMN(冒牌经理 V0.3)
    最典型的加权平均算法单价=(一月内总金额*4+两月内(一月外)总金额*2+两月外总金额)/
    (一月内总数量*4+两月内(一月外)总数量*2+两月外总数量)
    -------------------------------------
    好复杂,你看这样行吗?
    insert into 库存表 select 'a','a1','111',10,100,'入库','2006-1-1'
    insert into 库存表 select 'a','a1','111',10,200,'入库','2006-1-10'
    insert into 库存表 select 'a','a1','111',20,300,'入库','2006-1-20'出库单价=(10*100+10*200+20*300)/(10+10+20)
    这样做简单,但是否贴近事实呢
      

  22.   

    --要看你的需求了,如果是加权平均的话
    create table 库存表(
     商品类别   varchar(50),
     商品名称   varchar(50),
     商品规格   varchar(50),
     数量       int,
     单价       int,
     库存标志   char(10)
     
    )insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',10,100,'入库'
    insert into 库存表 select 'a','a1','111',20,100,'入库'
    --------------------------------------
    declare @num int
    set @num=5           ---此次出库数量5
    insert into 库存表 
    select 商品类别,商品名称,商品规格,@num
    ,sum((case when 库存标志='入库' then 数量 else 0 end)*单价)/sum( case when 库存标志='入库' then 数量 when 库存标志='出库' then -数量 end) as 價格 
    ,'出库' from 库存表 
    group by 商品类别,商品名称,商品规格---------------------------------------
    select * from 库存表商品类别 商品名称  商品规格  数量    单价      库存标志
    ------------------------------------------------------------
    a a1 111 10 100 入库      
    a a1 111 10 100 入库      
    a a1 111 20 100 入库      
    a a1 111 5 100 出库    --如果再出库10的话:  
    declare @num int
    set @num=10          ---再出库数量10
    insert into 库存表 
    select 商品类别,商品名称,商品规格,@num
    ,sum((case when 库存标志='入库' then 数量 else 0 end)*单价)/sum( case when 库存标志='入库' then 数量 when 库存标志='出库' then -数量 end) as 價格 
    ,'出库' from 库存表 
    group by 商品类别,商品名称,商品规格
    ----
    select * from 库存表商品类别 商品名称  商品规格  数量    单价      库存标志
    ------------------------------------------------------------
    a a1 111 10 100 入库      
    a a1 111 10 100 入库      
    a a1 111 20 100 入库      
    a a1 111 5 100 出库      
    a a1 111 10 114 出库      
      

  23.   

    playwarcraft(时间就像乳沟,挤挤还是有的)对了,我想"加权平均法"就是象您所写的那样,虽然可能还不规范,但是我想目前的系统够用了.多谢帮助.再次感谢.有机会跟您学习一下,先进先出的算法,现在好多软件都用这个
      

  24.   

    CSDMN(冒牌经理 V0.3) ------------------------多谢指点.
      

  25.   

    /*
    create table Stock(
     ProductType   varchar(50),
     ProductName   varchar(50),
     ProductSpec   varchar(50),
     Qty       int,
     Price       int,
     Flag   char(10) 
    )
    insert into Stock select 'a','a1','111',10,100,'入库'
    insert into Stock select 'a','a1','111',10,100,'入库'
    insert into Stock select 'a','a1','111',20,100,'入库'insert into 库存表 select 'a','a1','111',5,(10*100+10*100+20*100)/(10+10+20)
    ,'出库'
    --我理解,要是再出库5,所等数据是不是
    insert into 库存表 select 'a','a1','111',,((10-5)*100+10*100+20*100)/((10-5)+10+20),'出库'
    --再一次出库8:第一条已完成,再进行下一条数据
    insert into 库存表 select 'a','a1','111',8,(10*100+20*100)/(10+20),'出库'*/
    CREATE PROCEDURE TestOutStock
    @deOutQty decimal(18,0)
    AS
    set nocount ondeclare @iTID int
    ,@iMaxID int
    select @iTID=0
    ,@iMaxID=0select identity(int,1,1) TID,* 
    into #IncreaseStock 
    from Stock--select * from #IncreaseStock
    select @iMaxID=max(TID) from #IncreaseStock  
    select @iTID=max(TID)
    from 
    (
    select *,
    (
    select sum(Qty) from #IncreaseStock B where (B.TID<A.TID or B.TID=A.TID)
    ) IncreaseQty
    from #IncreaseStock A
    ) B
    where B.TID>=case when B.IncreaseQty>=@deOutQty then @iMaxID+1 else 0 end
    set @iTID=isnull(@iTID,0)+1--print @iTIDselect TID,ProductType,ProductName,ProductSpec
    --,Qty
    ,Qty-(case when IncreaseQty-@deOutQty<0 then 0 else IncreaseQty-@deOutQty end) Qty
    ,Price
    ,'出库' Flag
    ,case when IncreaseQty-@deOutQty<0 then 0 else IncreaseQty-@deOutQty end InitQty
    into #OutStockQty
    --,Qty-(case when IncreaseQty-@deOutQty<0 then 0 else IncreaseQty-@deOutQty end) OutQty
    from 
    (
    select *,
    (
    select sum(Qty) from #IncreaseStock B where (B.TID<A.TID or B.TID=A.TID)
    ) IncreaseQty
    from (select * from #IncreaseStock where TID<=@iTID) A
    ) Bselect ProductType,ProductName,ProductSpec,Qty
    ,(select sum(A.Qty*A.Price)/sum(A.Qty)  from  #IncreaseStock A where A.TID>=B.TID) Price
    ,Flag
    from #OutStockQty B
    /*
    select * from #IncreaseStock A
    left join  #OutStockQty B
    on A.TID=B.TID
    */
    drop table #OutStockQty
    drop table #IncreaseStock
    set nocount off
    GO---测试:
    exec TestOutStock 15  --入库数楼主,这是以上的代码实现。
    不知道是不是你想要的业务分析需求。