/*******************
  OS(操作系统): Win2003
  DB(数据库版本): SQLserver2000专业版]  
  SP(数据库补丁):SP4
*******************/
--创建表结构:
create table sp
(bh char(8) null default '',
 kh char(2) null default '',
 plh char(10) null default '',
 shl int,
 snn int IDENTITY (1, 1) NOT NULL  
)create table ls
(bh char(8) null default '',
 kh char(2) null default '',
 shl int
)
--测试数据insert into sp
(bh,kh,plh,shl)
select '100001','1','10111',0
union
select '100001','1','10132',30  
union
select '100001','1','10133',2
union
select '100001','1','10134',0  
--第一组测试数据  ‘100001’的销售数量大于库存数量insert into ls
(bh,kh,shl)
select '100001','1',40--第二组测试数据  ‘100001’的销售数量为负数insert into ls
(bh,kh,shl)
select '100001','1',-20
delete from sp
delete from ls
-- 语句
select b.bh,b.kh,b.plh,b.shl as kcsl,sl=case when b.kcsl-ls.shl<=0 and b.kcsl<b.zsl then 0  
when b.kcsl-ls.shl<=0 and b.kcsl=b.zsl then b.kcsl-ls.shl
when b.kcsl-ls.shl>0 and   
(select isnull(sum(shl),0) from sp  
where sp.bh=b.bh and sp.kh=b.kh and sp.snn<b.snn)<ls.shl
then b.kcsl-ls.shl else b.shl end,b.snn
from   
(select *,kcsl=(select sum(shl) from sp a  
where a.bh=sp.bh and a.kh=sp.kh and a.snn<=sp.snn),
zsl=(select sum(shl) from sp a  
where a.bh=sp.bh and a.kh=sp.kh) from sp) b
left join ls
on ls.bh=b.bh and ls.kh=b.kh--经过测试发现 如果ls表中的数据都为正数 或者 商品的总销售数小于总库存数时 没有问题
--第一组数据的问题是当 商品的总销售数量大于总库存数时 并且 该商品的中间的排列号有库存 100001 的第3、4条记录被多减了10
--第二组数据的问题是当商品的总销售数为负数时 100001 的库存没有加上  

解决方案 »

  1.   

    商品的总销售数量大于总库存数时?
    商品的总销售数为负数?
    这是不是应该用逻辑控制 怎么会出现这样的事情?
      

  2.   


    第一 系统允许负库存销售
    第二 如果当日退货数量大于销售数量 则销售数量为负数
      

  3.   

    兄弟这样的特殊情况你可以特殊来处理--第一组数据的问题是当 商品的总销售数量大于总库存数时 并且 该商品的中间的排列号有库存 100001 的第3、4条记录被多减了10
    --第二组数据的问题是当商品的总销售数为负数时 100001 的库存没有加上  
    这两个情况 你可以分成2个条件来单独处理  
    问题就迎刃而解