1.库存表
编码   仓库    库存   成本价   
001    02       2     1.2   
001    03       5     1.2   
002    01       3      5.6   
002    02       2      5.6   每个仓库成本价都是一样的,因为我是用移动加权,如果我本次进货如下:   2.进货表注意:进货仓库是 02 编码     进货数量    单价   
001         2       1.8   
002         3       6   
结果(仓库)
编码   仓库    库存   成本价  
001    02      4      1.33 
001    03      5      1.33 
002    01      3      5.75 
002    02      5      5.75 1.要把商品进到相应的仓库里面 
2.如果库存表某仓库不存在,则添加 (比如:库存表没有05仓库,但是我进货表的进货仓库是05,那么库存表生成一条05仓库的记录)
3.有两个表库存表和进货表,都要用到移动加权=(库存总金额+本次进货金额)/(库存总数量+本次进货数量)怎样用 UPDATE 语句写 求成本价

解决方案 »

  1.   

    update a set
        库存=a.库存+isnull(b.进货数量,0),
        成本价=(c.金额+isnull(b.金额,0))/(c.库存+isnull(b.进货数量,0))
    from 库存表 a inner join (
    select 编码,sum(库存) as 库存,sum(库存*成本价) as 金额 from  库存表
    group by 编码
    ) as c
    on a.编码=b.编码
    left join (
    select 编码,sum(进货数量) as 进货数量,sum(进货数量*单价) as 金额 from  进货表 
    group by 编码
    ) as b
    on a.编码=b.编码 and a.仓库='02'
      

  2.   

    你表达问题的能力真是够。,你要的是不是这个?update 库存表 
    SET 库存 = a.库存 + b.库存, 
        成本价 = (a.库存*a.成本价 + b.库存*b.成本价 )/(a.库存 + b.库存 )
    FROM 进货表 a JOIN 进货表 b ON a.编码 = b.编码
    WHERE a.仓库 = '02'
      

  3.   

    写少了update a set
        库存=a.库存+isnull(b.进货数量,0),
        成本价=(c.金额+isnull(b.金额,0))/(c.库存+isnull(b.进货数量,0))
    from 库存表 a inner join (
    select 编码,sum(库存) as 库存,sum(库存*成本价) as 金额 from  库存表
    group by 编码
    ) as c
    on a.编码=b.编码
    left join (
    select 编码,sum(进货数量) as 进货数量,sum(进货数量*单价) as 金额 from  进货表 
    group by 编码
    ) as b
    on a.编码=b.编码 and a.仓库='02'insert 库存表(编码,仓库,库存,成本价)
    select 
        b.编码,
        '02',
        库存=b.进货数量,
        成本价=(isnull(c.金额,0)+b.金额)/(isnull(c.库存,0)+b.进货数量)
    from (
    select 编码,sum(进货数量) as 进货数量,sum(进货数量*单价) as 金额 from  进货表 
    group by 编码
    ) as b left join (
    select 编码,sum(库存) as 库存,sum(库存*成本价) as 金额 from  库存表
    group by 编码
    ) as c
    on b.编码=c.编码
    where not exists (
    select 1 from 库存表
    where 编码=b.编码 and 仓库='02'
    )
      

  4.   

    有没有用一条语句的办法   Update
      

  5.   

    试试:
    update a set 库存 = a.库存 + (case when 仓库='02' then b.进货数量 else 0 end)
                ,单价 =(b.进货金额+c.金额)/(b.数量+c.数量)
    from 库存表 a
    ,(select 编码,sum(进货数量)  进货数量,sum(进货数量*单价) 进货金额 from 进货表) b
    ,(select 编码,sum(库存) 数量,sum(库存*成本价) 金额 from 库存表 group by 编码) c
    where a.编码=b.编码 and a.编码  = c.编码
      

  6.   

    try:
    update a set 库存 = a.库存 + (case when 仓库='02' then b.sl else 0 end)
                ,单价 =(b.je+c.je)/(b.sl+c.sl)
    from 库存表 a
    ,(select 编码 bm,sum(进货数量) sl,sum(进货数量*单价) je from 进货表 group by 编码) b
    ,(select 编码 bm,sum(库存) sl,sum(库存*成本价) je      from 库存表 group by 编码) c
    where a.编码=b.bm and a.编码  = c.bm
      

  7.   

    case when 仓库='02'万一不止2个仓库怎么办……
      

  8.   

    where not exists (
    select 1 from 库存表
    where 编码=b.编码 and 仓库='02')请问一下Haiwer : 为什么用 Select 1  , 而不用 select * 或 select 字段名   
      

  9.   

    一条语句不可能,必须有insert 和 update两条语句才能实现。
    另:如果你的需求不是基于差价调拨的话,楼主的表设计不符合2NF,建议将成本价从库存表中分离。
      

  10.   

    cson_cson  谢谢指点! 
      

  11.   

    请问 cson_cson  如果我销售时我是不是要汇总某个商品一个时间段库存,,还是汇总所有进货库存,,会慢吗
      

  12.   

    update a set
        库存=a.库存+isnull(b.进货数量,0),
        成本价=(c.金额+isnull(b.金额,0))/(c.库存+isnull(b.进货数量,0))
    from 库存表 a inner join (
    select 编码,sum(库存) as 库存,sum(库存*成本价) as 金额 from  库存表
    group by 编码
    ) as c
    on a.编码=b.编码
    left join (
    select 编码,sum(进货数量) as 进货数量,sum(进货数量*单价) as 金额 from  进货表 
    group by 编码
    ) as b
    on a.编码=b.编码 and a.仓库='02'
    里面的 left join 该成 Inner Join 可以吗?