求一个先进先出的SQL语句。

ykwang 2011-09-13 09:45:10
有两个表A表,B表

A表
下单日期 产品型号 下单数量
2011-09-01 AT001 10
2011-09-05 AT001 20
2011-09-13 AT001 30
2011-09-02 AT002 20
2011-09-13 AT002 30

B表
入库日期 产品型号 入库数量
2011-09-11 AT001 12
2011-09-13 AT001 6
2011-09-13 AT002 28

需要返回结果:

下单日期 产品型号 已下单未入库数量
2011-09-05 AT001 12
2011-09-13 AT001 30
2011-09-13 AT002 22

是这样的要求:第一条返回结果中的 12个数值是这样算出来的,先统计入库表,统计出来AT001总共是 18个,然后按A表的下单数值比对,相当于2011-09-01的AT001的10个数量已经完成。2011-09-05 的AT001本有20个再减去完成的 8个,剩余12个。2011-09-13的30个还没有完成。 所有显示出来
AT002 产品也是一样,总共入库22个,减去第一个下单20个,剩余8个,2011-09-13 单的30个减去8个,等于22个。

条件:1、以日期为准的先后顺序
2、同一个日期只会有一个产品编号。

谢谢

...全文
107 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykwang 2011-09-14
  • 打赏
  • 举报
回复
这个查询语句的目的是: 查询出哪些订单还没有入库,入库日期不用管它。把入库的数据统计起来,然后减去订单的下单数据,把哪些订单没有入库的记录给显示出来。
--小F-- 2011-09-13
  • 打赏
  • 举报
回复
给个例子你先看看

--库存先进先出简单例子:

create table t(
id int identity(1,1),
name varchar(50),--商品名称
j int, --入库数量
c 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!=c
end
else
raiserror('库存不足',16,1)
return
go


--测试:

exec wsp @name='A',@cost=180
select * from t


--drop table t
--drop proc wsp
-晴天 2011-09-13
  • 打赏
  • 举报
回复
1.不可能得到楼主的数据,5号还没有入库,12哪来的?
2.产品2入库28个,不是22个@!
3.同一个日期只有一个产品编号?看看你要的结果...

以入库为基础统计:
create table tbA(下单日期 datetime,产品型号 nvarchar(10),下单数量 int)
insert into tbA select '2011-09-01','AT001',10
insert into tbA select '2011-09-05','AT001',20
insert into tbA select '2011-09-13','AT001',30
insert into tbA select '2011-09-02','AT002',20
insert into tbA select '2011-09-13','AT002',30
create table tbB(入库日期 datetime,产品型号 nvarchar(10),入库数量 int)
insert into tbB select '2011-09-11','AT001',12
insert into tbB select '2011-09-13','AT001',6
insert into tbB select '2011-09-13','AT002',28
go
select 入库日期,产品型号,
(select sum(下单数量) from tba where 产品型号=b.产品型号 and 下单日期<=b.入库日期)-
(select sum(入库数量) from tbb where 产品型号=b.产品型号 and 入库日期<=b.入库日期)下单未入库 from tbb b
/*
入库日期 产品型号 下单未入库
----------------------- ---------- -----------
2011-09-11 00:00:00.000 AT001 18
2011-09-13 00:00:00.000 AT001 42
2011-09-13 00:00:00.000 AT002 22

(3 行受影响)

*/
go
drop table tba,tbb

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧