第二次开贴,解决100分相送!万分感谢!

Angelnet 2003-10-21 04:09:15
我有四个表
表一:入仓编号,入仓日期
表二:入仓编号,物料编号,物料名称,物料规格,入仓数量
表三:出仓编号,出仓日期
表四:出仓编号,物料编号,物料名称,物料规格,出仓数量

请问能不能实现以下表
物料编号 物料名称 物料规格 入仓日期 入仓数量 出仓日期 出仓数量 存仓数
L-001   皮纸   20×30 2003-10-18 100 2003-10-18 20 80
L-001 皮纸   20×30 2003-10-19 150 230
L-001 皮纸   20×30 200310-20 30 200
我的是SQL2000数据库.

...全文
43 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Angelnet 2003-10-22
  • 打赏
  • 举报
回复
万分感谢pengdali(大力 V3.0)!
lvxqfc 2003-10-21
  • 打赏
  • 举报
回复
或者这样也行,不会出现那样的空值了
select isnull(a.物料编号,b.物料编号),isnull(a.物料名称,b.物料名称),isnull(a.物料规格,b.物料规格),a.入仓日期,a.入仓数量,
b.出仓日期,b.出仓数量 into #a
from
(select a.物料编号,a.物料名称,a.物料规格,b.入仓日期,sum(a.入仓数量) as 入仓数量
from 表二 as a inner join 表一 as b on a.物料编号=b.物料编号
group by a.物料编号,a.物料名称,a.物料规格,b.入仓日期
) as a
full join
(select a.物料编号,a.物料名称,a.物料规格,b.出仓日期,sum(a.出仓数量) as 出仓数量
from 表四 as a inner join 表三 as b on a.物料编号=b.物料编号
group by a.物料编号,a.物料名称,a.物料规格,b.出仓日期
) as b on a.物料编号=b.物料编号 and a.物料名称=b.物料名称 and
a.物料规格=b.物料规格 and a.入仓日期=b.出仓日期
select a.*,
(select isnull(sum(入仓数量),0)-isnull(sum(出仓数量),0)
from #a where 物料编号=a.物料编号 and 物料名称=a.物料名称 and
物料规格=a.物料规格 and (入仓日期<=a.入仓日期 or 入仓日期<=a.出仓日期 or 出仓日期<=a.入仓日期 or 出仓日期<=a.出仓日期) ) as 存仓数 from #a as a
lvxqfc 2003-10-21
  • 打赏
  • 举报
回复
你的表结构设计的有问题,如果改成这样就很好地解决
表一:入仓编号,物料编号,入仓日期,入仓数量
表二:出仓编号,物料编号,出仓日期,出仓数量
表三:物料编号,物料名称,物料规格

pengdali 2003-10-21
  • 打赏
  • 举报
回复
你只要:

select isnull(aa.物料编号,bb.物料编号) 物料编号,isnull(aa.物料名称,bb.物料名称) 物料名称,
isnull(aa.物料规格,bb.物料规格) 物料规格,aa.入仓日期,aa.入仓数量,bb.出仓日期,bb.出仓数量
into #a
from (
select a.入仓日期,b.* from 表一 a join 表二 b on a.入仓编号=b.入仓编号) aa full join
(select a.出仓日期,b.* from 表三 a join 表四 b on a.出仓编号=b.出仓编号) bb on aa.入仓日期=bb.出仓日期

select *,(select sum(isnull(入仓数量,0)-isnull(出仓数量,0)) from #a where isnull(入仓日期,出仓日期)<=isnull(tem.入仓日期,tem.出仓日期)) from #a tem
order by isnull(入仓日期,出仓日期)


OK!
pengdali 2003-10-21
  • 打赏
  • 举报
回复
说明:

其中 #表一,#表二,#表三,#表四 是模拟你的表,#a为中间临时表是为了提高查询速度和效率。 你改成过程后drop table #a可以不要。以上举例结果为:

物料编号 物料名称 物料规格 入仓日期 入仓数量 出仓日期 出仓数量
---------- ---------- ---------- ------------------------------------------------------ ----------- ------------------------------------------------------ ----------- -----------
L-001 皮纸 20×30 2003-10-18 00:00:00.000 100 2003-10-18 00:00:00.000 20 80
L-001 皮纸 20×30 2003-10-19 00:00:00.000 150 NULL NULL 230
L-001 皮纸 20×30 NULL NULL 2003-10-20 00:00:00.000 30 200

(所影响的行数为 3 行)
pengdali 2003-10-21
  • 打赏
  • 举报
回复
create table #表一 (入仓编号 varchar(10),入仓日期 datetime)
create table #表二 (入仓编号 varchar(10),物料编号 varchar(10),物料名称 varchar(10),物料规格 varchar(10),入仓数量 int)
create table #表三 (出仓编号 varchar(10),出仓日期 datetime)
create table #表四 (出仓编号 varchar(10),物料编号 varchar(10),物料名称 varchar(10),物料规格 varchar(10),出仓数量 int)
insert #表一 values(1,'2003-10-18')
insert #表二 values(1,'L-001','皮纸','20×30',100)
insert #表一 values(2,'2003-10-19')
insert #表二 values(2,'L-001','皮纸','20×30',150)
insert #表三 values(1,'2003-10-18')
insert #表四 values(1,'L-001','皮纸','20×30',20)
insert #表三 values(2,'2003-10-20')
insert #表四 values(2,'L-001','皮纸','20×30',30)

select isnull(aa.物料编号,bb.物料编号) 物料编号,isnull(aa.物料名称,bb.物料名称) 物料名称,
isnull(aa.物料规格,bb.物料规格) 物料规格,aa.入仓日期,aa.入仓数量,bb.出仓日期,bb.出仓数量
into #a
from (
select a.入仓日期,b.* from #表一 a join #表二 b on a.入仓编号=b.入仓编号) aa full join
(select a.出仓日期,b.* from #表三 a join #表四 b on a.出仓编号=b.出仓编号) bb on aa.入仓日期=bb.出仓日期

select *,(select sum(isnull(入仓数量,0)-isnull(出仓数量,0)) from #a where isnull(入仓日期,出仓日期)<=isnull(tem.入仓日期,tem.出仓日期)) from #a tem
order by isnull(入仓日期,出仓日期)
go
drop table #表一,#表二,#表三,#表四,#a
Angelnet 2003-10-21
  • 打赏
  • 举报
回复
select a.物料编号,a.物料名称,a.物料规格,a.入仓日期,a.入仓数量,
b.出仓日期,b.出仓数量 into #a
from
(select a.物料编号,a.物料名称,a.物料规格,b.入仓日期,sum(a.入仓数量) as 入仓数量
from 表二 as a inner join 表一 as b on a.物料编号=b.物料编号
group by a.物料编号,a.物料名称,a.物料规格,b.入仓日期
) as a
full join
(select a.物料编号,a.物料名称,a.物料规格,b.出仓日期,sum(a.出仓数量) as 出仓数量
from 表四 as a inner join 表三 as b on a.物料编号=b.物料编号
group by a.物料编号,a.物料名称,a.物料规格,b.出仓日期
) as b on a.物料编号=b.物料编号 and a.物料名称=b.物料名称 and
a.物料规格=b.物料规格 and a.入仓日期=b.出仓日期
select a.*,
(select isnull(sum(入仓数量),0)-isnull(sum(出仓数量),0)
from #a where 物料编号=a.物料编号 and 物料名称=a.物料名称 and
物料规格=a.物料规格 and (入仓日期<=a.入仓日期 or 入仓日期<=a.出仓日期 or 出仓日期<=a.入仓日期 or 出仓日期<=a.出仓日期) ) as 存仓数 from #a as a

这是 w_rose(w_rose) 给出的答案,非常感谢他!
可是这样有个问题:
当某一天某一物料只有出仓数据,而当天没有相应物料的进仓数据时。只能显示“出仓日期”和“出仓数量的值,而物料编号、物料名称,物料规格显示为空。万分感谢!

34,874

社区成员

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

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