出入库分摊算法
sql吧
全部回复
仅看楼主
level 1
jjsbxt1987 楼主
大神能帮我解答下么?
现有出入库明细,按先进先出的原理,将入库按出库时间分摊,一直到分摊完。各种情况都会产生,如 出库>=入库,当天入库全部分摊到出库,剩余的出库由下一个入库分摊。 当出库<入库,入库按出库的日期排序,依次分摊,直到之前的出库分摊完。 有同一天的出库和入库,入库不补当天的,只补之前日期的出库。 需要在原始表上自动增加分摊数据,并且更改起始日期为“补足”。 出入库任何时间都可能有,不一定按我例子的日期, 表里数据会有几万条,希望处理速度快。
数据库: sql2000
字段:日期Datea, 出入库A1(正数是出库,负数是入库),结余量A2,起始日期Dbegin
举例: 原始表
Datea A1 A2 Dbegin
1-1 100 100 1-1
1-2 -100 0 1-2
1-3 100 100 1-3
1-4 60 40 1-4
1-5 100 140 1-5
1-8 10 150 1-8
1-8 -160 -10 1-8
1-10 10 0 1-10
1-12 10 10 1-12
1-13 20 30 1-13
1-15 -30 0 1-15
1-15 10 10 1-15
1-17 10 0 1-17
分摊数据插入后的表
Datea A1 A2 Dbegin
1-1 100 100 1-1
1-2 -100 0 1-2
1-1 100 补足
1-3 100 100 1-3
1-4 60 40 1-4
1-3 60 补足
1-5 100 140 1-5
1-8 10 150 1-8
1-8 -160 -10 1-8
1-5 100 补足
1-3 40 补足
1-10 10 0 1-10
1-12 10 10 1-12
1-13 20 30 1-13
1-12 10 补足
1-10 10 补足
1-8 10 补足
1-15 -30 0 1-15
1-15 10 10 1-15
1-13 20 补足
1-17 10 0 1-17
2020年11月27日 03点11分 1
level 8
不难,数据库是 SQL server 2000看出应该是很油历史的软件了。
这个根据需求最难是排序而已,因为其实就是原始表 UNION ALL 运算后补足逻辑 然后排序
不过你给出的结果上有一个问题,就是原始表跟运算后补足逻辑栏位数不一样。字段类型也不一样。
2020年11月27日 06点11分 2
level 8
begin
declare @datea datetime,
@a1 int,
@巴冬🌀 int,
@挺拔又刻苦的小鸥o datetime ,
@sum int,
@row int,
@A3 int,
@A4 int,
@getrow int
CREATE TABLE [#TEMP]( [Datea] [datetime] NULL, [A1] [int] NULL, [A2] [int] NULL, [Dbegin] [datetime] NULL, [Remark] varchar(50))
CREATE TABLE [#TEMP2]( [Datea] [datetime] NULL, [A1] [int] NULL, [A2] [int] NULL, [Dbegin] [datetime] NULL, [row] [int] null)
DECLARE cuTemp CURSOR FOR
SELECT [Datea] ,[A1] ,[A2] ,[Dbegin] FROM [原始表]
set @sum=0
set @row=0
open cuTemp
FETCH next from cuTemp into @Datea,@A1,@A2,@Dbegin
WHILE @@FETCH_STATUS =0
begin
INSERT INTO [#TEMP] ([Datea] ,[A1] ,[A2] ,[Dbegin],[Remark])
VALUES (@Datea,@A1,@A2,@Dbegin,'')
if(@A1)>0
begin
INSERT INTO [#TEMP2] ([Datea] ,[A1] ,[A2] ,[Dbegin],[Row])
VALUES (@Datea,@A1,@A2,@Dbegin,@row)
set @row=@row+1
end
if (@A1<0)
begin
set @sum=@A1
DECLARE cuTemp2 CURSOR FOR
SELECT [Datea]
,[A1]
,[A2]
,[Dbegin]
,[Row]
FROM [#TEMP2]
order by [row]
open cuTemp2
FETCH next from cuTemp2 into @Datea,@A3,@A4,@Dbegin,@getrow
WHILE @@FETCH_STATUS =0
begin
IF (@sum+@A3<=0)
begin
INSERT INTO [#TEMP] ([Datea] ,[A1] ,[A2] ,[Dbegin],[Remark])
VALUES (@Dbegin,@A3,NULL,NULL,'补足')
set @sum=@sum+@A3
delete [#TEMP2] where [ROW]=@getrow
end
FETCH next from cuTemp2 into @Datea,@A3,@A4,@Dbegin,@getrow
end
CLOSE cuTemp2
DEALLOCATE cuTemp2
end
FETCH next from cuTemp into @Datea,@A1,@A2,@Dbegin
end
CLOSE cuTemp
DEALLOCATE cuTemp
select * from [#TEMP]
end
2020年11月27日 08点11分 9
1