入库信息
时间 数量 单价 商品ID
2003.1.1 10 10 1
2003.1.5 20 15 1
2003.1.8 15 20 1
出库信息
时间 数量 商品ID
2003.1.2 5 1
2003.1.8 26 1
查询结果
入库时间 数量 单价 商品ID
2003.1.1 5 10 1 对应出库 5
2003.1.1 5 10 1 对应出库 26
2003.1.5 20 15 1 对应出库 26
2003.1.8 1 20 1 对应出库 26
查询的结果是要查询出库的单价来,而出库的单价要根据入库的情况计算出来。就是把入库数量的信息按出库的数量分配。同时把入库的单价也查询出来。
select A.时间 时间,A.数量-B.数量 数量,A.单价 单价,A.商品ID 商品ID
from 入库信息表 A,出库信息表 B
where A.商品ID=B.商品ID and A.时间<B.时间
这是先进先出的结果,做起来挺负责的。
1:昨天还看到有先进先出法的贴子,你找一下。
2:如果在入库时指定一唯一的批号,出库时按此批号出库,那就简单多了。
create table 入库信息(
时间 datetime,
数量 int,
单价 int,
商品ID int)
insert 入库信息 select 2003-1-1, 10, 10, 1
insert 入库信息 select 2003-1-5, 20, 15, 1
insert 入库信息 select 2003-1-8, 15, 20, 1
create table 出库信息(
时间 datetime,
数量 int,
商品ID int)
insert 出库信息 select 2003-1-2, 5, 1
insert 出库信息 select 2003-1-8, 26, 1
select * into #t from 入库信息
select * into #t1 from #t where 1 = 2
declare @odate datetime
declare @idate datetime
declare @id int
declare @oamt int
declare @iamt int
declare @price int
set @id = 1
select top 1 @oamt = 数量, @odate = 时间 from 出库信息 where 商品ID = @id order by 时间
while @oamt > 0
begin
select top 1 @iamt = 数量, @price = 单价, @idate = 时间 from #t order by 时间
if @iamt > @oamt
begin
update #t set 数量 = 数量 - @oamt where 时间 = @idate
insert #t1 select @idate, @oamt, @price, @id
set @oamt = 0
end
else
begin
delete #t where 时间 = @idate
insert #t1 select @idate, @iamt, @price, @id
set @oamt = @oamt - @iamt
end
if @oamt = 0
begin
select top 1 @oamt = 数量, @odate = 时间 from 出库信息 where 商品ID = @id and 时间 > @odate order by 时间
end
end
select * from #t1
时间 数量 单价 商品ID
------------------------------------------------------ ----------- ----------- -----------
2003-01-01 00:00:00.000 5 10 1
2003-01-01 00:00:00.000 5 10 1
2003-01-05 00:00:00.000 20 15 1
2003-01-08 00:00:00.000 1 20 1