建立视图复杂问题,高手指点!

zhjian6 2005-12-12 03:09:09
货物表:
T1
ID号(ID),货物名(GName),数量(GCount),重量(GWeight)
2 铜 10 10
3 铁 5 9
4 铝 8 7

数量(GCount),重量(GWeight)是当前的库存。

出货表:
TOut
出货表ID(OID),货物TID(T1.ID),数量(OutCount),重量(OutWeight),出货日期(OutDate)
1 2 5 15 2005-12-2 09:00
入货表:
TIn
入库表ID(IID),货物TID(T1.ID),数量(InCount),重量(InWeight),入货日期(InDate)
1 2 15 20 2005-12-1 08:00

盘存表:
TCheck
货物CID,数量(CCount),重量(CWeight),日期(CDate)
2 0 0 2005-12-1 00:00
3 0 0 2005-12-1 00:00
4 0 0 2005-12-1 00:00
2 10 5 2005-12-4 00:00
3 20 10 2005-12-4 00:00
4 15 8 2005-12-4 00:00

不定期的盘存,记下某一天的库存。


要得到的视图是,每一天,货物的结存。
如:
视图:
货物TID(T1.ID),日期, 数量(TCount),重量(TWeight)
2 2005-12-1 15 20
2 2005-12-2 20 30
2 2005-12-3 30 40
.....................
一直到今天,然后是ID为3的货货物和2一样,反正是所有的货物都列出来


逻辑关系是:
如,ID为2的货物,视图中查出的是
如,2005-12-1的结存 为 上一次的盘存的数量和重量加上当天的入库重量和数量,再减去出库重量和数量。
2005-12-2的结存 就是2005-12-1 的结存,加上2005-12-2当天的入库重量和数量,再减去出库重量和数量。
2005-12-3的结存 就是2005-12-2 的结存,加上2005-12-3当天的入库重量和数量,再减去出库重量和数量。
直到下一次盘存,
2005-12-4 的结存就是盘存加上 当天出入库。
...全文
188 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ReViSion 2005-12-16
  • 打赏
  • 举报
回复
6)最后SELEct * from #3
ReViSion 2005-12-16
  • 打赏
  • 举报
回复
你没有提供测试数据,那我就说一下想法(我这里以统计一个月为例)
1)创建一个临时的日期表,只有一个日期字段(date)
记录内容为本月的所有日期 ,设为 #1
2)货物表T1与日期表#1连接,得到本月所有需要统计的物料日期表
select id,date into #2 from T1
left join #1 on 1>0
3)#2和TCheck连接,得到盘存中存在的记录,不存在则重量数量补0 ,并设置标记
select a.id,a.date,CCount=isnull(b.CCount,0),CWeight=isnull(b.CWeight,0),ISNull=Case b.ccount is null then 1 else 0 end
into #3 from #2 a
left join TCheck b
on a.id=b.cid and a.date=b.日期

--2)和3)可以合为一步

4)如果本月第一天的数据不存在则求得本月第一天的数据,并把第一天的ISnull设为0

5)填充不完整的盘存,iSNULL为1的补完,否则保存
DEclare @Count int
Declare @Wight int

update #3 set @Count=CCount=case isnull when 1 then @Count+(当前进入库的差额) else CCount end ,@Wight=CWeight=case isnull when 1 then @Count+(当前进入库的差额) else
CWight end
from #3,Tin,Tout
where #3.date=Tin.日期 and #3.date=Tout.日期 and id=id(各个表ID号等)






zhjian6 2005-12-14
  • 打赏
  • 举报
回复
可以,有什么好的方案解决?
zhjian6 2005-12-13
  • 打赏
  • 举报
回复
up
ReViSion 2005-12-13
  • 打赏
  • 举报
回复
我想问一下能不能不用视图,
zhjian6 2005-12-12
  • 打赏
  • 举报
回复
想建个视图把每天的都补完
ReViSion 2005-12-12
  • 打赏
  • 举报
回复
你的盘存数据在盘存表(TCheck)不是都有了吗?
只是中间有间隔不同的空缺而已对不对?你现在是不是想建个视图把每天的都补完?


还是完全不从盘存表中取数据,直接从入货表和出货表中得到每天的结存?



新鲜鱼排 2005-12-12
  • 打赏
  • 举报
回复
up
zhjian6 2005-12-12
  • 打赏
  • 举报
回复
create view dbo.V_Day_Check
as
select a.CID,
a.CDate
a.CCount+isnull(b.InCount,0)-isnull(c.OutCount,0) as TCount,
a.CWeight+isnull(b.InWeight,0)-isnull(c.OutWeight,0) as TWeight
from TCheck a left join TIn b
on a.CID=b.TID and a.CDate=b.InDate
left join TOut c
on a.CID=c.TID and a.CDate=c.OutDate
Go
谢谢 mschen(发光的星星)
可能没看清题意,每天的结存都要,但是盘存,不是每天都有的,如果当天没有盘存,要从上一次盘存算起
mschen 2005-12-12
  • 打赏
  • 举报
回复
create view dbo.V_Day_Check
as
select a.CID,
a.CDate
a.CCount+isnull(b.InCount,0)-isnull(c.OutCount,0) as TCount,
a.CWeight+isnull(b.InWeight,0)-isnull(c.OutWeight,0) as TWeight
from TCheck a left join TIn b
on a.CID=b.TID and a.CDate=b.InDate
left join TOut c
on a.CID=c.TID and a.CDate=c.OutDate
Go
zhjian6 2005-12-12
  • 打赏
  • 举报
回复
每天做事务是吧,但是出货表和入库表,是手工输入有时候会有错的,还有几天前的数据也有可能今天输
zhouhaihe 2005-12-12
  • 打赏
  • 举报
回复
up
yangbo88 2005-12-12
  • 打赏
  • 举报
回复
建议每天做日结
zhjian6 2005-12-12
  • 打赏
  • 举报
回复
分不够,可以再开个100分,是比较复杂,高手们幸苦了
老本 2005-12-12
  • 打赏
  • 举报
回复
如果要最后一千年的数据,你不要晕死啊!

34,594

社区成员

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

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