关于订单扣减的问题

amazeyeli 2018-07-27 08:35:44
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,248),
('MD180091','2018-04-03','BH14-084-099-18',700,295),
('MD180147','2018-06-02','BH14-084-099-18',400,400),
('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 销售表;
----------------------------------------
--订单表是公司的所有订单,因生产日期不同,生产成本可能不同
--销售表是5家经销店的销售记录,销售单价可能不同
--现在需要将各个销售单号归到订单号中去,以计算利润
--运行结果参考如下:
----------------------------------------
/*
销售日期 订单号 销售单号 产品 数量
2018-7-9 MD180090 4212345704 BH14-084-099-05 112
2018-7-9 MD180090 4212345710 BH14-084-099-05 112
2018-7-9 MD180090 4212345716 BH14-084-099-05 24
2018-7-9 MD180091 4212345704 BH14-084-099-18 102
2018-7-9 MD180091 4212345710 BH14-084-099-18 102
2018-7-9 MD180091 4212345716 BH14-084-099-18 91
2018-7-9 MD180147 4212345716 BH14-084-099-18 79
2018-7-9 MD180147 4212345722 BH14-084-099-18 84
2018-7-9 MD180147 4212345728 BH14-084-099-18 107
2018-7-9 MD180148 4212345716 BH14-084-099-05 162
2018-7-9 MD180148 4212345722 BH14-084-099-05 92
2018-7-9 MD180148 4212345728 BH14-084-099-05 118
*/
...全文
178 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰云 2018-07-27
  • 打赏
  • 举报
回复
然后呢....

你想说什么???
  • 打赏
  • 举报
回复
里面用到了游标,如果针对要处理的数据量级较大,CURSOR要慎用,会引起性能上的问题, 此时可通过把数据取到应用层,由应用程序来解决这个问题
  • 打赏
  • 举报
回复

IF object_id('tempdb..#ordersDis') is not null
Begin
    DROP TABLE #ordersDis
End
if object_id('tempdb..#salesTmp') is not null
Begin
    DROP TABLE #salesTmp
End

SELECT t2.[销售日期],t1.[订单号],t2.[销售单号],t1.[产品],t1.[订单数量] [数量]
	INTO #ordersDis
	FROM [订单表] t1 inner Join [销售表] t2 on t1.[产品] = t2.[产品] and 1 > 2 

SELECT [销售日期],[销售单号],[产品],[销售数量] INTO #salesTmp FROM [销售表];
	
DECLARE @orderNO NVARCHAR(32);
DECLARE @orderGoods NVARCHAR(32);
DECLARE @orderLastGoods NVARCHAR(32);
DECLARE @orderQty INT;
DECLARE @orderDate DATE;

DECLARE @saleDate DATE;
DECLARE @saleNO NVARCHAR(32);
DECLARE @saleGoods NVARCHAR(32);
DECLARE @saleQty INT;

set @orderQty = 0;
set @saleQty = 0;
set @orderLastGoods = '';

DECLARE orderCursor CURSOR FOR SELECT [订单号],[产品],[订单余数],[下单日期] FROM [订单表] order by [下单日期] ASC; 
OPEN orderCursor
FETCH NEXT FROM orderCursor INTO @orderNO,@orderGoods,@orderQty,@orderDate 
WHILE (@@fetch_status=0 Or @orderQty > 0)
Begin	 
	Begin				
		DECLARE saleCursor CURSOR FOR SELECT [销售日期],[销售单号],[产品],[销售数量] FROM #salesTmp 
										WHERE [产品]= @orderGoods and [销售数量] > 0 ORDER BY [销售日期] ASC; 
		SET @orderLastGoods = @orderGoods;
		
		OPEN saleCursor
		FETCH NEXT FROM saleCursor into @saleDate,@saleNO,@saleGoods,@saleQty 
		DECLARE @hasSaleDataTag INT;
		SET @hasSaleDataTag = 0;
		
		while (@@fetch_status=0)
		Begin
			SET @hasSaleDataTag = 1;
			If @saleQty > 0 and @orderQty > 0
			Begin
				if @orderQty >= @saleQty
				Begin
					Insert into #ordersDis([销售日期],[订单号],[销售单号],[产品],[数量]) values(@saleDate,@orderNO,@saleNO,@orderGoods,@saleQty);
					set @orderQty = @orderQty - @saleQty;
					set @saleQty = 0;
					--可添加更新减少订单表订单余量的语句,或是更新销售单已分配处理销售数量的语句
					UPDATE #salesTmp SET [销售数量] = @saleQty WHERE [销售单号] = @saleNO and [产品] = @orderGoods;
				End
				else if @orderQty < @saleQty
				Begin
					Insert into #ordersDis([销售日期],[订单号],[销售单号],[产品],[数量]) values(@saleDate,@orderNO,@saleNO,@orderGoods,@orderQty);
					set @saleQty = @saleQty - @orderQty;
					set @orderQty = 0;
					--可添加更新减少订单表订单余量的语句,或是更新销售单已分配处理销售数量的语句
					UPDATE #salesTmp SET [销售数量] = @saleQty WHERE [销售单号] = @saleNO and [产品] = @orderGoods;
				End
			End
			if @saleQty <= 0
				FETCH NEXT FROM saleCursor INTO @saleDate,@saleNO,@saleGoods,@saleQty 
			if @orderQty <= 0
				break;
		End
		
		IF @hasSaleDataTag = 0
		BEGIN
			SET @orderQty = 0;
		END
		
		CLOSE saleCursor
		DEALLOCATE saleCursor
	End
	
	If @orderQty <= 0
    Begin
		FETCH NEXT FROM orderCursor INTO @orderNO,@orderGoods,@orderQty,@orderDate;
    End
End
CLOSE orderCursor
DEALLOCATE orderCursor 

SELECT [销售日期],[订单号],[销售单号],[产品],[数量] FROM #ordersDis;
运行结果:
销售日期	订单号	销售单号	产品	数量
2018-07-09	MD180090	4212345704	BH14-084-099-05	112
2018-07-09	MD180090	4212345710	BH14-084-099-05	112
2018-07-09	MD180090	4212345716	BH14-084-099-05	24
2018-07-09	MD180091	4212345704	BH14-084-099-18	102
2018-07-09	MD180091	4212345710	BH14-084-099-18	102
2018-07-09	MD180091	4212345716	BH14-084-099-18	91
2018-07-09	MD180147	4212345716	BH14-084-099-18	79
2018-07-09	MD180147	4212345722	BH14-084-099-18	84
2018-07-09	MD180147	4212345728	BH14-084-099-18	107
2018-07-09	MD180148	4212345716	BH14-084-099-05	162
2018-07-09	MD180148	4212345722	BH14-084-099-05	92
2018-07-09	MD180148	4212345728	BH14-084-099-05	118

22,301

社区成员

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

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