超难度而又实用的题求解,怎样求某一时间段的仓存明细。急急急!!!!

qzxyd 2003-12-12 05:32:42
我有三个表,tstock:当前库存表,tin:进仓,tout:出仓
现在我想找出某一时间段t1,t2的所有进出库的明细,明细包括产品名,t1时库存,
t2时库存,入库数,进库数。要注意在t1,t2时间段内没有进出库的不要显示。
有进出库的不能漏。
...全文
6 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zjcxc 元老 2003-12-13

--为方便调用,用存储过程
create proc p_qry
@t1 datetime, --查询的开始时间
@t2 datetime --查询的结束时间
as
select a.产品名称
,t1时库存=isnull(b.库存数量,0)+出仓数量-入仓数量
,入仓数量,出仓数量
,t2时库存=(isnull(b.库存数量,0)+出仓数量-入仓数量)+出仓数量-入仓数量
from(
select 产品名称=isnull(a.产品名称,b.产品名称
,入仓数量=isnull(入仓数,0),出仓数量=isnull(出仓数,0)
from(
select 产品名称,入仓数=sum(进仓数量) from tIn
where 进仓日期 between @t1 and @t2 group by 产品名称
) a full join(
select 产品名称,出仓数=sum(出仓数量) from tOut
where 出仓日期 between @t1 and @t2 group by 产品名称
) b on a.产品名称=b.产品名称
) a left join tstock b on a.产品名称=b.产品名称
go

--调用:
exec p_qry '2003-01-01','2003-12-31'
  • 打赏
  • 举报
回复
qzxyd 2003-12-13
我有三个表,tstock:当前库存表,tin:进仓,tout:出仓
现在我想找出某一时间段t1,t2的所有进出库的明细,明细包括产品名,t1时库存,
t2时库存,入库数,进库数。要注意在t1,t2时间段内没有进出库的不要显示。
有进出库的不能漏。

-------------------------------------------------------------------
表结构如下(最简单的拉):
当前库存表tstock
产品名称,库存数量
进仓表tIn
产品名称,进仓数量,进仓日期
出仓表tOut
产品名称,出仓数量,出仓日期
产品名称为主关健字
现在要想找出某一时间段t1,t2的所有进出库的明细,如我输入时间t1,t2想得到
产品名称,t1时库存,入仓数量,出仓数量,t2时仓库存
...
...
...
其明细中只能显示在t1,t2时间段内有进出仓库的产品。没有进出不要显示出来。
t2时库存=t1时库存+出仓数量-入仓数量
t1时库存=当前库存+出仓数量-入仓数量
  • 打赏
  • 举报
回复
qzxyd 2003-12-13
t2时库存=(isnull(b.库存数量,0)+出仓数量-入仓数量)+出仓数量-入仓数量
不明

我已解决:
-------------------------------------------
declare @t1 varchar(20),@t2 varchar(20)
set @t1='2003-10-12 0:0:0'
set @t2='2003-12-20 23:59:59'

select ItemNo,inputStock,Reject,CarryCount,LargessCount
,Stock1=Stock2-inputStock+Reject+CarryCount+LargessCount,Stock2
from
(
select ItemNo=isnull(t1.fItemNo,t2.ItemNo),InputStock=isnull(InputStock,0)
,Reject=isnull(Reject,0),CarryCount=isnull(CarryCount,0)
,LargessCount=isnull(LargessCount,0)
from
(select fItemNo,inputStock=sum(fCount)
from tFinish where fType<>'R' and fdtFinish between @t1 and @t2 group by fItemNo) t1
full join

(select ItemNo=isNull(clItemNo,fItemNo),CarryCount,LargessCount,Reject
from
(select clItemNo,CarryCount=sum(clCarryCount),LargessCount=sum(clLargessCount)
from tCarryList,tSend where sNo=clSendNo and sdtSend between @t1 and @t2 group by clItemNo) t21
full join
(select fItemNo,Reject=sum(fCount)
from tFinish where fType='R' and fdtFinish between @t1 and @t2 group by fItemNo) t22
on clItemNo=fItemNo) t2

on t1.fItemNo=t2.ItemNo
) a left join

(select mlNo,stock2=isnull(mlstock-inputStock+Reject+CarryCount+LargessCount,mlStock)
from
(
select ItemNo=isnull(t1.fItemNo,t2.ItemNo),InputStock=isnull(InputStock,0)
,Reject=isnull(Reject,0),CarryCount=isnull(CarryCount,0)
,LargessCount=isnull(LargessCount,0)
from
(select fItemNo,inputStock=sum(fCount)
from tFinish where fType<>'R' and fdtFinish>@t2 group by fItemNo) t1
full join

(select ItemNo=isNull(clItemNo,fItemNo),CarryCount,LargessCount,Reject
from
(select clItemNo,CarryCount=sum(clCarryCount),LargessCount=sum(clLargessCount)
from tCarryList,tSend where sNo=clSendNo and sdtSend>@t2 group by clItemNo) t21
full join
(select fItemNo,Reject=sum(fCount)
from tFinish where fType='R' and fdtFinish>@t2 group by fItemNo) t22
on clItemNo=fItemNo) t2

on t1.fItemNo=t2.ItemNo
) t right join tMaterialList on mlNo=ItemNo) b

on a.ItemNo=b.mlNo
  • 打赏
  • 举报
回复
fenglaotou 2003-12-12
gz
  • 打赏
  • 举报
回复
yoki 2003-12-12
--下面的仅供参考:(转)

--数据测试环境
create table 物料明细表(物料ID varchar(6),名称 varchar(10),规格 varchar(10),颜色 varchar(10),单位 varchar(10),所属类别 varchar(10))
insert into 物料明细表
select 'A-001','皮纸','20×30×50','红','张','纸'
union all select 'B-002','磁铁','20×10×50','','块','五金'

create table 进仓主表 (进仓ID varchar(20),供应商ID varchar(10),进仓日期 datetime,原凭证号 varchar(10),入库类型 int)
insert into 进仓主表
select 'J-20031015-001','SA001','2003-10-15','123456',1
union all select 'J-20031015-002','SA002','2003-10-15','123457',1
union all select 'J-20031017-001','SA002','2003-10-17','123456',2

create table 进仓明细表 (进仓ID varchar(20),物料ID varchar(6),数量 decimal(20,2))
insert into 进仓明细表
select 'J-20031015-001','A-001',200
union all select 'J-20031015-002','B-002',99
union all select 'J-20031017-001','A-001',150.5

create table 出仓主表 (出仓ID varchar(20),部门ID varchar(10),领料日期 datetime,领料单号 varchar(10),出库类型 varchar(1))
insert into 出仓主表
select 'C-20031015-001','Dept_P','2003-10-15','1111111','P'
union all select 'C-20031016-001','Dept_P','2003-10-16','1111112','P'

create table 出仓明细表 (出仓ID varchar(20),物料ID varchar(6),数量 decimal(20,2))
insert into 出仓明细表
select 'C-20031015-001','A-001',50
union all select 'C-20031016-001','A-001',50


go

--为数据处理添加视图
create view qry进仓单
as
select b.物料ID,a.进仓日期,进仓数量=sum(b.数量)
from 进仓主表 a join 进仓明细表 b on a.进仓ID=b.进仓ID
group by b.物料ID,a.进仓日期

go
create view qry出仓单
as
select b.物料ID,出仓日期=a.领料日期,出仓数量=sum(b.数量)
from 出仓主表 a join 出仓明细表 b on a.出仓ID=b.出仓ID
group by b.物料ID,a.领料日期

go
create view qry进出记录
as
select 物料ID=isnull(a.物料ID,b.物料ID)
,a.进仓日期,进仓数量=sum(a.进仓数量)
,b.出仓日期,出仓数量=sum(b.出仓数量)
,日期=isnull(a.进仓日期,b.出仓日期)
from qry进仓单 a full join qry出仓单 b
on a.物料ID=b.物料ID and a.进仓日期=b.出仓日期
group by isnull(a.物料ID,b.物料ID),a.进仓日期,b.出仓日期,isnull(a.进仓日期,b.出仓日期)


go
--实现楼主的要求:

--进出记录表
select a.*
,进仓日期=convert(varchar(10),b.进仓日期,120),b.进仓数量
,出仓日期=convert(varchar(10),b.出仓日期,120),b.出仓数量
,当前库存=isnull((select sum(进仓数量) from qry进仓单 where 物料ID=a.物料ID and 进仓日期<=b.日期),0)
-isnull((select sum(出仓数量) from qry出仓单 where 物料ID=a.物料ID and 出仓日期<=b.日期),0)
from 物料明细表 a left join qry进出记录 b on a.物料ID=b.物料ID
order by a.物料ID,b.日期

--当前库存表
select a.*,b.当前库存
from 物料明细表 a left join (
select 物料ID,当前库存=isnull(sum(进仓数量),0)-isnull(sum(出仓数量),0) from qry进出记录 group by 物料ID
)b on a.物料ID=b.物料ID
order by a.物料ID
  • 打赏
  • 举报
回复
yoki 2003-12-12
表结构总得贴出来呀?
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2003-12-12 05:32
社区公告
暂无公告