22,301
社区成员




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
*/
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