读书人

如果实现这样子一个结果集?解决思路

发布时间: 2012-01-12 22:11:58 作者: rapoo

如果实现这样子一个结果集?
下单表T1:
负责人 客户 品种 下单数量 日期
1 2 3 10 2007-02-10
1 2 3 30 2007-02-14

出货表T2:
负责人 客户 品种 出货数量 日期
1 2 3 2 2007-02-15
1 2 3 4 2007-02-16
1 2 3 2 2007-02-17
1 2 3 10 2007-02-18
通过下单表T1和出货表T2,如何查询统计出这样子的累计表T3:
负责人 客户 品种 下单数量 出货数量 剩余数量 日期
1 2 3 10 10 0 2007-02-10
1 2 3 30 8 22 2007-02-14
总之就是先用最早的下单数量减去出货数量,直到最早日期的剩余量为0,然后再用第二个日期的下单量减去出货数量,以此类推。


[解决办法]
结构有问题吧....

例如:

如果下单1,2分别是:10, 30,
出货时,却是下单2先出的货.即:出20,

你怎么可能用最早的日期下单货量-出货量? 那就不是零,而是负数了.

不知道我这样说,是不是存在这个问题.
[解决办法]
本人认为从业务上讲出货是根据下单来的.因此,表结构应为:

下单表T1:
下单ID 负责人 客户 品种 下单数量 日期

出货表T2:
出货ID 下单ID 出货数量 日期


如此才是正确便捷的表结构及关系.
[解决办法]
declare @sum int
select @sum=sum(出货数量) from T2
select 负责人,客户,品种,下单数量,0 as 出货数量,0 as 剩余数量,日期 into #temp from T1 order by 日期
update T1 set @sum=@sum-下单数量,
出货数量=(case when @sum> =0 then 下单数量 when @sum+下单数量> =0 then @sum+下单数量 else 0 end),
剩余数量=(case when @sum> =0 then 0 when @sum+下单数量> =0 then -@sum else 下单数量 end)
select * from #temp

------解决方案--------------------


上面随手写的update的表名写错了,这里是测试数据
declare @t1 table(负责人 int,客户 int, 品种 int, 下单数量 int, 日期 datetime)
insert into @t1 select 1, 2, 3, 10, '2007-02-10 '
union select 1, 2, 3, 30, '2007-02-14 '
declare @t2 table(负责人 int,客户 int, 品种 int, 出货数量 int, 日期 datetime)
insert into @t2 select 1, 2, 3, 2, '2007-02-15 '
union select 1, 2, 3, 4, '2007-02-16 '
union select 1, 2, 3, 2, '2007-02-17 '
union select 1, 2, 3, 10, '2007-02-18 '

declare @sum int
select @sum=sum(出货数量) from @T2
select 负责人,客户,品种,下单数量,0 as 出货数量,0 as 剩余数量,日期 into #temp from @T1 order by 日期
update #temp set @sum=@sum-下单数量,
出货数量=(case when @sum> =0 then 下单数量 when @sum+下单数量> =0 then @sum+下单数量 else 0 end),
剩余数量=(case when @sum> =0 then 0 when @sum+下单数量> =0 then -@sum else 下单数量 end)
select * from #temp
drop table #temp
--结果
负责人 客户 品种 下单数量 出货数量 剩余数量 日期
------- ----- ------ -------- -------- -------- -------
1 2 3 10 10 0 2007-02-10
1 2 3 30 8 22 2007-02-14

读书人网 >SQL Server

热点推荐