日期:2014-05-17  浏览次数:20550 次

求“先进先出法”计算库存商品余额价值的SQL语句

MS-SQL数据库,表Tb的结构和内容如下

RecId    InOrOut   spId      Dj       Sl
------------------------------------------
1          1       999      590      120
2         -1       999     (800)    (110)
3          1       999      580       80
4         -1       999     (800)     (50)
5          1       999      570      100
6          1       999      560       50
7         -1       999     (800)     (30)

上述记录是按RecId顺序发生的
其中InOrOut为1时,表明商品入库;InOrOut为-1时,表明商品出库
Dj和Sl分别是当时入库或出库时的单价、数量
spId是不同商品的ID,为了描述直观,表中只列出一种商品的情况

显然,在第7条记录(销售出库30件)完成时,spId为999的商品剩余160件,这160件商品的价值,按先进先出法,应为90800元,即:
第6条记录的(50*560=28000) + 第5条记录的(100*570=57000) + 第3条记录的(10*580=5800),合计为90800元

求计算表Tb中现余商品的价值的SQL语句,多谢(要考虑多种商品spId的情况)。
顺祝论坛朋友们,各位光临本贴的老师们,马年顺利!
------解决方案--------------------
做移动平均加权,简单很多。
------解决方案--------------------
按照你的需求,查询的结果是什么呢,能贴出来不
------解决方案--------------------
select 
  spid,
  SUM(SI*InOrOut) AS SL,
  SUM(DJ*SI*InOrOut) AS Value
from tb
group by spid
------解决方案--------------------
--加减法,更新明细账的结余数量和金额 @sBeginQty和@sBeginSum期初数量和金额,单价=金额/数量。
Create Table #ResStoreAccDet_Sums
(
   GID      varchar(50)    null,
   BeginQty Numeric(18, 6) null,
   BeginSum Numeric(18, 6) null,
   InQty    Numeric(18, 6) null,
   InSum    Numeric(18, 6) null,
   OutQty   Numeric(18, 6) null, 
   OutSum   Numeric(18, 6) null,
   EndQty   Numeric(18, 6) null,
   EndSum  Numeric(18, 6) null)

update #ResStoreAccDet_Sums
set EndQty =(select @sBeginQty +Sum(Isnull(InQty, 0)) -Sum(Isnull(OutQty, 0)) 
             from #ResStoreAccDet_Sums where SID <=t.SID),
    EndSum =(select @sBeginSum +Sum(Isnull(InSum, 0)) -Sum(Isnull(OutSum, 0)) 
            from #ResStoreAccDet_Sums where SID <=t.SID)