• sql 先进先出 库存


    create table t( 
    id int identity(1,1), name varchar(50),--商品名称 
    j int,        --入库数量 
    c int,        --出库数量 
    jdate datetime --入库时间 
    ) 
    insert into t(name,j,c,jdate) select  'A',100,0,'2007-12-01' 
    insert into t(name,j,c,jdate) select  'A',200,0,'2008-01-07' 
    insert into t(name,j,c,jdate) select  'B',320,0,'2007-12-21' 
    insert into t(name,j,c,jdate) select  'A',100,0,'2008-01-15' 
    insert into t(name,j,c,jdate) select  'B',90,0,'2008-02-03' 
    insert into t(name,j,c,jdate) select  'A',460,0,'2008-02-01' 
    insert into t(name,j,c,jdate) select  'A',510,0,'2008-03-01' 
    go
    
    create proc wsp 
    @name varchar(50),--商品名称 
    @cost int         --销售量 
    as 
    --先得出该货物的库存是否够 
    declare @spare float --剩余库存 
    select @spare=sum(j)-sum(c) from t where name=@name 
    if(@spare>=@cost)                         
       begin 
        --根据入库日期采用先进先出原则对货物的库存进行处理  
         update t set c=                                                                                                                      
         case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<=a.jdate and j!=c)>=0 
         then a.j 
         else                        
            case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<a.jdate and j!=c)<0 
            then 0 
            else (select @cost-isnull(sum(j),0)+isnull(sum(c),0)+a.c from t where name=@name and jdate<a.jdate and j!=c) 
            end 
         end 
         from t a where name=@name and j!=c 
       end 
    else 
        raiserror('库存不足',16,1)    
        return 
    go
    
    
    --测试:
    
    exec wsp @name='A',@cost=110 
    select * from t
    
    
    --drop table t 
    --drop proc wsp
    
    /*
    
    (4 行受影响) 
    id          name                                               j           c           jdate 
    ----------- -------------------------------------------------- ----------- ----------- ----------------------- 
    1           A                                                  100         100         2007-12-01 00:00:00.000 
    2           A                                                  200         200         2008-01-07 00:00:00.000 
    3           B                                                  320         0           2007-12-21 00:00:00.000 
    4           A                                                  100         30          2008-01-15 00:00:00.000 
    5           B                                                  90          0           2008-02-03 00:00:00.000 
    6           A                                                  460         0           2008-02-01 00:00:00.000 
    7           A                                                  510         0           2008-03-01 00:00:00.000
    
    (7 行受影响) 
    */
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    CREATE TABLE #tmp 
      ( ID int IDENTITY (1, 1),  
      单价 decimal(18, 2) NOT NULL ,  
      进库数量 decimal(18, 0) NOT NULL ,  
      已出数量 decimal(18, 0) NOT NULL 
      ) 
      insert into #tmp(单价,进库数量,已出数量) values(1.1,50,0) 
      insert into #tmp(单价,进库数量,已出数量) values(1.3,30,0) 
      insert into #tmp(单价,进库数量,已出数量) values(1.4,60,0) 
      insert into #tmp(单价,进库数量,已出数量) values(1.5,20,0) 
      
          
      select * from #tmp  
       
       
      declare @t decimal(18, 0) --一次出库数量 
    ,@temp decimal(18, 0) --某一单价的临时出库数量 
      select @t=20 
      update #tmp set @temp= 
      case when @t>进库数量-已出数量 
      then 进库数量-已出数量 --当出库数量大于某一单价的结存数量时,那么此单价的出库数量就是结存数量,也就是说此单价的库存数量全部消耗完。 
      else @t --出库数量小于或等于某一单价的结存数量时,那么此次的出库数量就是实际的出库数量 
      end, 
       @t=@t-@temp,--减去一次针对某个单价的临时出库数量 
       已出数量=@temp+已出数量 --新出库的数量+以前出库的数量 
       where 已出数量<>进库数量 --某个单价出库完了就不参于出库计算,即结存数为零的就排除在外 
       select * from #tmp 
        
        
    set @t=40 
       update #tmp set @temp= 
       case when @t>进库数量-已出数量 
       then 进库数量-已出数量 
       else @t 
       end, 
       @t=@t-@temp, 
       已出数量=@temp+已出数量 
       where 已出数量<>进库数量 
       
       select * from #tmp 
       
       go 
       drop table #tmp
  • 相关阅读:
    关于Javascript的有趣的3个小知识
    linux支持串口(serial)登录配置方法
    Silicom Linux BypassSD Control Utilitybypass command
    USB隨身碟版的Clonezilla live
    如何將Clonezilla live放到一個已經有其他作業系統存在的硬碟中
    clonezilla for usb as ghost or backup,auto ghost,auto backup(再生龙一键还原(备份)的制作)
    典型PC机上各种操作的近似时间
    linux网络问题子网掩码与网关不在同一段的处理
    Linux family member.(AS/ES/WS)
    华为交换机常用命令
  • 原文地址:https://www.cnblogs.com/lydg/p/11363797.html
Copyright © 2020-2023  润新知