关于订单扣减的问题

amazeyeli 2018-07-26 08:55:11
USE tempdb 
GO
IF OBJECT_ID('订单表') IS NOT NULL
DROP TABLE 订单表;
GO
CREATE TABLE 订单表
(
订单号 CHAR(8),
下单日期 DATE,
产品 CHAR(15),
订单数量 INT,
订单余数 INT
);
GO
INSERT INTO 订单表 VALUES --订单数量<>订单余数表示该产品之前有销售过
('MD180090','2018-04-03','BH14-084-099-05',600,295),
('MD180091','2018-04-03','BH14-084-099-18',700,700),
('MD180147','2018-06-02','BH14-084-099-18',400,248),
('MD180148','2018-06-02','BH14-084-099-05',500,500);
GO
SELECT * FROM 订单表;

IF OBJECT_ID('销售表') IS NOT NULL
DROP TABLE 销售表;
GO
CREATE TABLE 销售表
(
销售日期 DATE,
销售单号 CHAR(10),
产品 CHAR(15),
销售数量 INT
);
GO
INSERT INTO 销售表 VALUES --同一天同一产品销售单号为个位数
('2018-07-09','4212345704','BH14-084-099-05',112),
('2018-07-09','4212345704','BH14-084-099-18',102),
('2018-07-09','4212345710','BH14-084-099-05',112),
('2018-07-09','4212345710','BH14-084-099-18',102),
('2018-07-09','4212345716','BH14-084-099-05',186),
('2018-07-09','4212345716','BH14-084-099-18',170),
('2018-07-09','4212345722','BH14-084-099-05',92),
('2018-07-09','4212345722','BH14-084-099-18',84),
('2018-07-09','4212345728','BH14-084-099-05',118),
('2018-07-09','4212345728','BH14-084-099-18',107);
GO
SELECT * FROM 销售表;
----------------------------------------
--运行结果参考如下,销售单号可以无序,但订单号一定要先进先出.
----------------------------------------
/*
销售日期 订单号 销售单号 产品 数量
2018-7-9 MD180091 4212345728 BH14-084-099-18 107
2018-7-9 MD180091 4212345704 BH14-084-099-18 102
2018-7-9 MD180091 4212345710 BH14-084-099-18 86
2018-7-9 MD180147 4212345710 BH14-084-099-18 16
2018-7-9 MD180147 4212345716 BH14-084-099-18 170
2018-7-9 MD180147 4212345722 BH14-084-099-18 84
2018-7-9 MD180090 4212345728 BH14-084-099-05 118
2018-7-9 MD180090 4212345704 BH14-084-099-05 112
2018-7-9 MD180090 4212345710 BH14-084-099-05 18
2018-7-9 MD180148 4212345710 BH14-084-099-05 94
2018-7-9 MD180148 4212345716 BH14-084-099-05 186
2018-7-9 MD180148 4212345722 BH14-084-099-05 92
*/
...全文
156 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
amazeyeli 2018-07-26
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
分配完MD180090,不是应该分配MD180091这个订单么;不然这个“订单号一定要先进先出.”什么意思?


MD180090和MD180091不是同一个产品,可以同时分配,不成在先后顺序。
amazeyeli 2018-07-26
  • 打赏
  • 举报
回复
示例中有2个产品,产品要一一对应
amazeyeli 2018-07-26
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
分配完MD180090,不是应该分配MD180091这个订单么;不然这个“订单号一定要先进先出.”什么意思?

md180090和md180091不是同一个产品呢
二月十六 2018-07-26
  • 打赏
  • 举报
回复
分配完MD180090,不是应该分配MD180091这个订单么;不然这个“订单号一定要先进先出.”什么意思?
amazeyeli 2018-07-26
  • 打赏
  • 举报
回复
将7月9号的销售记录分配到各个订单中去,同一天的销售单号先后顺序可以随意,但订单号一定要先进先出。
即必须把MD180090单295件产品全部分配到销售单号中去,可以是04单112件+10单112件+16单(295-224=)71件,也可以是1楼分的结果,都可以;分配完MD180090单之后才能分配MD180148单。
amazeyeli 2018-07-26
  • 打赏
  • 举报
回复
引用 1 楼 leo_lesley 的回复:
描述的太含糊

将7月9号的销售记录分配到各个订单中去,同一天的销售单号先后顺序可以随意,但订单号一定要先进先出。
必须把
leo_lesley 2018-07-26
  • 打赏
  • 举报
回复
描述的太含糊
shinger126 2018-07-26
  • 打赏
  • 举报
回复
引用 8 楼 shinger126 的回复:
你这个需求,起码销售单上要加一个列,已分配数量,然后用游标循环处理
CREATE TABLE 订单批次表(订单号 CHAR(8),产品 CHAR(15),销售单号 CHAR(10),销售数量 INT)
GO

ALTER TABLE 销售表 ADD 已分配数量 int
GO

DECLARE @orderbill CHAR(8),@salebill CHAR(10),@qty_order INT,@qty_sale INT,@qty INT,@item CHAR(15)
DECLARE c1 CURSOR FOR SELECT 订单号,产品,订单余数 FROM 订单表 WHERE 订单余数>0 ORDER BY 下单日期
OPEN c1
FETCH NEXT FROM c1 INTO @orderbill,@item,@qty_order
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE c2 CURSOR FOR SELECT 销售单号,销售数量-ISNULL(已分配数量,0) 剩余数量 FROM 销售表
WHERE 产品=@item AND 销售数量>ISNULL(已分配数量,0)
OPEN c2
FETCH FROM c2 INTO @salebill,@qty_sale
WHILE @@FETCH_STATUS=0 AND @qty_order>0
BEGIN
--分配数量
SET @qty=CASE WHEN @qty_order<=@qty_sale THEN @qty_order ELSE @qty_sale END
--插入结果表
INSERT INTO 订单批次表 VALUES (@orderbill,@item,@salebill,@qty)
--更新销售表和订单表
UPDATE 销售表 SET 已分配数量=ISNULL(已分配数量,0)-@qty WHERE 销售单号=@salebill AND 产品=@item
UPDATE 订单表 SET 订单余数= 订单余数-@qty WHERE 订单号=@orderbill AND 产品=@item
SET @qty_order=@qty_order-@qty
FETCH FROM c2 INTO @salebill,@qty_sale
END
CLOSE c2
DEALLOCATE c2
FETCH NEXT FROM c1 INTO @orderbill,@item,@qty_order
END
CLOSE c1
DEALLOCATE c1

SELECT * FROM 订单批次表

好像写的有点问题。不过一般是封装一个过程,每次传入一个订单号,里面用游标先进先出处理销售单,并更新订单余数和销售单的已分配数。
外面用游标循环获取订单,调用过程
shinger126 2018-07-26
  • 打赏
  • 举报
回复
你这个需求,起码销售单上要加一个列,已分配数量,然后用游标循环处理
CREATE TABLE 订单批次表(订单号 CHAR(8),产品 CHAR(15),销售单号 CHAR(10),销售数量 INT)
GO

ALTER TABLE 销售表 ADD 已分配数量 int
GO

DECLARE @orderbill CHAR(8),@salebill CHAR(10),@qty_order INT,@qty_sale INT,@qty INT,@item CHAR(15)
DECLARE c1 CURSOR FOR SELECT 订单号,产品,订单余数 FROM 订单表 WHERE 订单余数>0 ORDER BY 下单日期
OPEN c1
FETCH NEXT FROM c1 INTO @orderbill,@item,@qty_order
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE c2 CURSOR FOR SELECT 销售单号,销售数量-ISNULL(已分配数量,0) 剩余数量 FROM 销售表
WHERE 产品=@item AND 销售数量>ISNULL(已分配数量,0)
OPEN c2
FETCH FROM c2 INTO @salebill,@qty_sale
WHILE @@FETCH_STATUS=0 AND @qty_order>0
BEGIN
--分配数量
SET @qty=CASE WHEN @qty_order<=@qty_sale THEN @qty_order ELSE @qty_sale END
--插入结果表
INSERT INTO 订单批次表 VALUES (@orderbill,@item,@salebill,@qty)
--更新销售表和订单表
UPDATE 销售表 SET 已分配数量=ISNULL(已分配数量,0)-@qty WHERE 销售单号=@salebill AND 产品=@item
UPDATE 订单表 SET 订单余数= 订单余数-@qty WHERE 订单号=@orderbill AND 产品=@item
SET @qty_order=@qty_order-@qty
FETCH FROM c2 INTO @salebill,@qty_sale
END
CLOSE c2
DEALLOCATE c2
FETCH NEXT FROM c1 INTO @orderbill,@item,@qty_order
END
CLOSE c1
DEALLOCATE c1

SELECT * FROM 订单批次表

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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