先进先出的两个简单例子

--------------------------------------------
   --  Author:TravyLee(跟小F姐姐混)
   --  Date  :2012-05-26 16:00:00
--------------------------------------------
Example One:
-------------------------------------------------------
create table djjx
(
djbh varchar(20), --单据编号 key
spid varchar(20), --商品ID
shl int --数量
)
--其中二行数据:
insert into djjx values('dj0001','sp0001',300)
insert into djjx values('dj0001','sp0002',100)
--表二:
create table sphwph  
(
spid varchar(20), --商品ID key
hw varchar(20), --货位 key
ph varchar(20), --批号 key
shl int --数量
)
其中几行数据:
insert into sphwph values('sp0001','hw0001','ph001',50)
insert into sphwph values('sp0001','hw0001','ph002',40)
insert into sphwph values('sp0001','hw0002','ph002',90)
insert into sphwph values

('sp0001','hw0003','ph003',500)
insert into sphwph values

('sp0001','hw0004','ph005',1000)
insert into sphwph values('sp0002','hw0001','ph006',90)
insert into sphwph values

('sp0002','hw0002','ph009',100)
/*
求得到如下结果或一张临时表:
djbh	spid	hw	ph	shl
dj0001 sp0001 hw001	ph001	50
dj0001 sp0001 hw001	ph002	40
dj0001 sp0001 hw002	ph002	90
dj0001 sp0001 hw003	ph003	120
dj0001 sp0002 hw001	ph006	90
dj0001 sp0002 hw002	ph009	10   
*/
;with t
as(
select id=row_number()over(partition by a.spid order by 

getdate()),
a.djbh,a.spid,a.shl as total,b.hw,b.ph,b.shl 
from djjx a inner join sphwph b on a.spid=b.spid
),
m as(
select id,djbh,spid,(total-shl) as total,hw,ph,shl from 

t where id=1
union all
select a.id,a.djbh,a.spid,b.total-a.shl,a.hw,a.ph,a.shl 

from t a
inner join m b on a.id=b.id+1 and a.spid=b.spid
)
select djbh,spid,hw,ph,
case when total<0 then shl-ABS(total) else shl end as 

shl 
from m where case when total<0 then shl-ABS(total) else 

shl end>0 order by spid,id
/*
djbh	spid	hw	ph	shl
dj0001	sp0001	hw0001	ph001	50
dj0001	sp0001	hw0001	ph002	40
dj0001	sp0001	hw0002	ph002	90
dj0001	sp0001	hw0003	ph003	120
dj0001	sp0002	hw0001	ph006	90
dj0001	sp0002	hw0002	ph009	10
*/

-------------------------------------------------------
Example Two
---->>TravyLee生成测试数据:
if OBJECT_ID('流水表') is not null
drop table 流水表
go
create table 流水表(
ProductNmae varchar(20),
Counts int,
Dates varchar(10),
Kinds varchar(2)
)
go
if OBJECT_ID('余额表') is not null
drop table 余额表
go
create table 余额表(
ProductNmae varchar(20),
Counts int,
Dates varchar(10)
)
go
insert 余额表
select '轴承',100,'5月1日' union all
select '端盖',200,'6月1日' union all
select '轴承',200,'7月1日' union all
select '轴承',330,'8月1日' union all
select '轴承',400,'9月1日'

-------------------------------------------
-------------------------------------------
---->>>触发器实现对余额表的管理
go
if OBJECT_ID('tri_test')is not null
drop trigger tri_test
go
create trigger tri_test on 流水表
for insert
as
--处理新增类型为'入'的零件的余额表数据更新

/*更新余额表中存在的日期的数据*/
update 余额表
set 余额表.Counts=t.Counts+余额表.Counts from(
select 
    ProductNmae,sum(Counts) Counts,Dates
from
    inserted i
where 
    exists(select 1 from 余额表 t 
         where i.ProductNmae=t.ProductNmae and 

i.Dates=t.Dates)
    and i.Kinds='入'
group by
    ProductNmae,Dates
)t
where
    余额表.ProductNmae=t.ProductNmae and 余额

表.Dates=t.Dates

/*插入日期在之前余额表中不存在的*/
insert 余额表
select 
    ProductNmae,sum(Counts),Dates
from
    inserted i
where 
    not exists(select 1 from 余额表 t 
         where i.ProductNmae=t.ProductNmae and 

i.Dates=t.Dates)
    and i.Kinds='入'
group by
    ProductNmae,Dates 

--处理新增类型为'出'的零件的余额表数据更新
/*先对余额表里的数据进行递归累计求和运算*/
;with t
as(
select 
    px=row_number()over(partition by ProductNmae 
   order by getdate()),ProductNmae,Counts,Dates
from 余额表
),m
as(
select px,ProductNmae,Counts,Counts as total,Dates
from t
where px=1
union all
select a.px,a.ProductNmae,a.Counts,
    a.Counts+b.total,a.Dates
from t a
inner join  m b
on a.px=b.px+1 and a.ProductNmae=b.ProductNmae
),
n as(
select m.px,m.ProductNmae,m.Dates,m.Counts,m.total 

totalm,b.total totaln
from m
inner join(
select ProductNmae,sum(Counts) as total from inserted 
where Kinds='出'
group by ProductNmae
)b on m.ProductNmae=b.ProductNmae
),
o as
(
select ProductNmae,Dates,
case when px in(select px from n where totalm-totaln<0) 

then 0
     when px=(select min(px) from n where totalm-

totaln>=0) then totalm-totaln
     else Counts end as NewCounts
from n
)
update 余额表
set 余额表.Counts=o.NewCounts from o
where 余额表.Dates=o.Dates and 余额

表.ProductNmae=o.ProductNmae
delete from 余额表 where Counts=0


--验证:
--当9月1日增加轴承50只时,9月2日增加端盖30只时表变成
insert 流水表
select '轴承',50,'9月1日','入' union all
select '端盖',30,'9月2日','入'

select * from 余额表
/*
ProductNmae	Counts	Dates
轴承	100	5月1日
端盖	200	6月1日
轴承	200	7月1日
轴承	330	8月1日
轴承	450	9月1日
端盖	30	9月2日
*/
--当9月3日出货轴承400只时,即是
insert 流水表
select '轴承',400,'9月3日','出'

select * from 余额表
/*
ProductNmae	Counts	Dates
端盖	200	6月1日
轴承	230	8月1日
轴承	450	9月1日
端盖	30	9月2日
*/
--新手刚学,方法较为笨拙,望各位赐教
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值