销售订单数据逐条核销问题

销售订单数据逐条核销问题

1,AT1表需逐条拆分的表其SL汇总数据3800等于BT1表总数据表SL的合计值3800.BA1表中可能有负值。
一般最后有负数,前面也可能有负数影响分配算法。
2,BT1表按序号顺序进行分配核销1800,累计值小于1800的直接分配1800对应的BB01ROWID,先分配1800,再分配500,再分配1500
3,某一行数据放第1核销数据1800会超过1800则需要拆分比如199拆分一个103统计到BB01即为1800,余下的写入到YLFPID(余量分配ID中)BB02分配96
4,余下的数据按类似的逻辑进行分配,分配结果如图所示。
5,FPROWID,YLFPID为BB01的FPSL(分配数量)+YL分配数量之和为1800
FPROWID,YLFPID为BB02的FPSL(分配数量)+YL分配数量之和为500
FPROWID,YLFPID为BB03的FPSL(分配数量)+YL分配数量之和为1500

相关建表代码及数据插入代码:


CREATE TABLE [dbo].[AT1](
    [XH] [int] NULL,
    [SL] [numeric](18, 3) NULL,
    [ROWID] [nvarchar](50) NULL,
    [FPSL] [numeric](18, 3) NULL,
    [FPROWID] [nvarchar](50) NULL,
    [FPFS] [nvarchar](50) NULL,
    [FPYL] [numeric](18, 3) NULL,
    [YLFPID] [nvarchar](50) NULL
) ON [PRIMARY]
GO
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (1,140,'AA01',140,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (2,150,'AA02',150,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (3,127,'AA03',127,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (4,146,'AA04',146,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (5,148,'AA05',148,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (6,160,'AA06',160,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (7,188,'AA07',188,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (8,178,'AA08',178,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (9,126,'AA09',126,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (10,156,'AA10',156,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (11,178,'AA11',178,'BB01','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (12,199,'AA12',103,'BB01','拆分分配',96,'BB02');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (13,200,'AA13',200,'BB02','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (14,100,'AA14',100,'BB02','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (15,134,'AA15',104,'BB02','全部分配',30,'BB03');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (16,156,'AA16',156,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (17,167,'AA17',167,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (18,180,'AA18',180,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (19,199,'AA19',199,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (20,122,'AA20',122,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (21,144,'AA21',144,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (22,166,'AA22',166,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (23,166,'AA23',166,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (24,177,'AA24',177,'BB03','全部分配',0,'');
insert into AT1 (XH,SL,ROWID,FPSL,FPROWID,FPFS,FPYL,YLFPID) values (25,-7,'AA25',-7,'BB03','全部分配',0,'');

CREATE TABLE [dbo].[BT1](
    [XH] [int] NULL,
    [SL] [numeric](18, 3) NULL,
    [ROWID] [nvarchar](50) NULL,
    
) ON [PRIMARY]
GO
insert into BT1 (XH,SL,ROWID) values (1,1800,'BB01');
insert into BT1 (XH,SL,ROWID) values (2,500,'BB02');
insert into BT1 (XH,SL,ROWID) values (3,1500,'BB03');

img

望采纳!!!点击回答右侧采纳即可!兄弟你不是写完了嘛?
这道题目的解决方案可以使用循环和判断语句来实现需求中的逐条核销。具体步骤如下:

从AT1表中读取每一条数据,并将其SL值累加至变量中。
从BT1表中读取每一条数据,并使用序号顺序进行分配。
对于每一条AT1表中的数据,检查其SL值是否小于BT1表中的当前分配值,如果是,则直接将该条数据的SL值全部分配给当前的BT1表数据;如果不是,则

需要进行拆分,将该条数据的SL值的一部分分配给当前的BT1表数据,剩余部分分配给YLFPID字段。
更新AT1表和BT1表中的FPSL,FPROWID,FPYL等字段,以记录核销信息。
重复上述步骤直至AT1表中所有数据都被核销完。

需要注意的是,在实现过程中需要注意负数的处理,以及累加变量的初始值等细节。此外需要注意验证分配结果是否符合要求。

你要解决什么问题?
想了下绿色的可能是你需要得出的。
那么就是SUM(SL) over(order by Xh asc) 获取AT1当前行的累计值 FPSL_TOT1, 获取截至上一行的累计值 FPSL_TOT0;
BT1表也就行如此操作 获取到截至当前行给的FPSL_TOT2
然后将AT1和BT1全关联。只取FPSL_TOT0<= FPSL_TOT2<=FPSL_TOT1 获取到临界的哪几个节点。
后面就是给这个节点上面和下面的赋值和做减法即可了。

2196+104=2330?

这道题目的解决方案可以使用循环和判断语句来实现需求中的逐条核销。具体步骤如下:

从AT1表中读取每一条数据,并将其SL值累加至变量中。
从BT1表中读取每一条数据,并使用序号顺序进行分配。

我也没明白你要解决什么问题?