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

求“先进先出法”计算库存商品余额价值的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)