sql 先进先出 库存

简介:
create   table  t( 
id 
int   identity ( 1 , 1 ), name  varchar ( 50 ), -- 商品名称 
int ,         -- 入库数量 
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 !=
   
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 

    本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2009/11/22/1608079.html,如需转载请自行联系原作者

相关文章
|
14天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
6天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
9天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
845 25
|
8天前
|
机器学习/深度学习 人工智能 搜索推荐
万字长文深度解析最新Deep Research技术:前沿架构、核心技术与未来展望
近期发生了什么自 2025 年 2 月 OpenAI 正式发布Deep Research以来,深度研究/深度搜索(Deep Research / Deep Search)正在成为信息检索与知识工作的全新范式:系统以多步推理驱动大规模联网检索、跨源证据。
579 46
|
2天前
|
监控 BI 数据库
打工人救星!来看看这两家企业如何用Quick BI让业务更高效
Quick BI专业版监控告警助力企业高效运作,通过灵活配置规则与多渠道推送,让数据异常早发现、快响应,推动业务敏捷决策与持续增长。
打工人救星!来看看这两家企业如何用Quick BI让业务更高效
|
8天前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
563 42