先进先出的两个简单例子
2012-05-26 17:27
483 查看
-------------------------------------------- -- 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日 */--新手刚学,方法较为笨拙,望各位赐教
相关文章推荐
- javaEE最简单例子两个属性的用法——action的method和result的name
- linux两个程序通过共享内存通信的一个简单例子
- static:静态的两个简单例子
- Caffe学习系列(9):运行caffe自带的两个简单例子
- Linux下两个程序进行socket通信的简单例子
- 【Echarts】百度Echarts的使用入门+两个简单的小例子+心得
- OpenCL buffer使用及两个简单例子
- Comparable与Comparator的两个小例子,简单容易理解
- 运行caffe自带的两个简单例子
- 举两个例子以快速明白Java中的简单工厂模式
- 两个简单例子揭示makefile中“=”和“:=”的区别
- 库存先进先出简单例子
- 从两个简单例子窥视协程的惊人性能(Python)
- c#关于Delegate最简单的例子:两个窗体间的消息传递
- 两个简单例子揭示makefile中“=”和“:=”的区别
- 自己预习做了两个简单的例子
- 基于mapreduce的两个简单例子
- SpringMVC的两个简单入门的例子(-)
- javaweb之Session简单例子(两个页面一个存数据,一个取数据)和session的一些基本内容
- OpenGL学习笔记 (1) —— 在VS2008下的两个简单例子