求一sql语句或者存储过程
现在有三个表
1. 库存表 (库存编号,产品编号,库存数量)
2. 采购单表(采购单编号,采购时间)
3. 采购单明细表(明细编号,采购单编号,产品编号,采购数量,过期时间)
假设出库的时候,都是先出 过期时间最早的,这样的话,能够根据 库存数量、采购明细 倒推出现有库存中最早的过期时间。 我现在想查询 30天后过期的 产品编号、库存数量、过期时间 ,请问sql语句或者存储过程改如何写,数据库用的sql server 2008, 谢谢!
------解决方案--------------------
--应该是getdate() 我没有测试,直接写的
select t1.产品编号,t1.过期时间,sum(t2.库存数量) as 库存数量
from 采购单明细表 t1 (nolock)
inner join 库存表 t2 (nolock) on t1.产品编号=t2.产品编号
where convert(varchar(10),t1.过期时间,120)>=convert(varchar(10),getdate()+30,120)
group by t1.产品编号,t1.过期时间
------解决方案--------------------来一个最笨的办法
游标遍历
declare @cpbh int
declare @kc decimal(18,3)
declare c1 cursor for select 产品编号,库存数量 from dbo.库存表
--where 产品编号=1
open c1
fetch next from c1 into @cpbh,@kc
while @@fetch_status=0
begin
declare @ljkc decimal(18,2) --累计库存
set @ljkc=0
declare @cgmxid int
declare @gqsj datetime
set @gqsj='6000-01-01'
while(@ljkc<@kc)
begin
select @ljkc=@ljkc+ a1.采购数量 ,@gqsj=a1.过期时间 from
采购单明细表 a1 where 产品编号=@cpbh
and a1.过期时间<@gqsj
and not exists( select 明细编号 from 采购单明细表 b1 where a1.产品编号=b1.产品编号
and b1.过期时间<@gqsj
and b1.过期时间>a1.过期时间)
print @kc
print @ljkc
print @gqsj
end
update dbo.库存表
set 过期时间=@gqsj
where 产品编号=@cpbh
fetch next from c1 into @cpbh,@kc
end
close c1
deallocate c1
------解决方案--------------------来个sql 递归
with tb(明细编号,产品编号 ,采购数量 ,过期时间 )
as (
select a1.明细编号,a1.产品编号 ,a1.采购数量 ,a1.过期时间 from
采购单明细表 a1 where not exists( select 明细编号 from 采购单明细表 b1 where a1.产品编号=b1.产品编号
and b1.过期时间>a1.过期时间)
union all
select a1.明细编号,a1.产品编号 ,cast( a1.采购数量 +tb.采购数量 as decimal(18,3) ) ,a1.过期时间
from 采购单明细表 a1 inner join tb
on a1.产品编号=tb.产品编号
and ( (a1.过期时间<tb.过期时间 ) or (a1.过期时间=tb.过期时间 and a1.明细编号<tb.明细编号) )
and not exists (select 明细编号 from 采购单明细表 b1 where b1.产品编号=a1.产品编号
and ( (b1.过期时间<tb.过期时间 ) or (b1.过期时间=tb.过期时间 and b1.明细编号<tb.明细编号) )
and ( (b1.过期时间>a1.过期时间 ) or (b1.过期时间=a1.过期时间 and b1.明细编号>a1.明细编号) )
)
)
update dbo.库存表
set 过期时间=(
select top 1 过期时间 from tb b
where 库存表.产品编号=b.产品编号
and 库存表.库存数量<=b.采购数量
order by b.过期时间 desc ,b.明细编号 desc
)
------解决方案--------------------with
t2 as
(
select b.*,row_number() over(order by