Sql server 从发货数量较高的Id中取出数量
我是新来这里的,我想出了一个方案,我必须从有发货的地方取出数量。例如,我有下表Sql server 从发货数量较高的Id中取出数量,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我是新来这里的,我想出了一个方案,我必须从有发货的地方取出数量。例如,我有下表 ID SKU QtyRec QTYDisp 1 001A 50 0 2 001A 50 10 3 001A 50 20 4 001A 50 0 我已取出40份。它应该首先从id 3中选择,然后从id 2中选择,然后从1或4中选择。因为3的发货数量大于2。但在我当前的场景中,它从id 1中选择40 DECLARE @Data table
ID SKU QtyRec QTYDisp
1 001A 50 0
2 001A 50 10
3 001A 50 20
4 001A 50 0
我已取出40份。它应该首先从id 3中选择,然后从id 2中选择,然后从1或4中选择。因为3的发货数量大于2。但在我当前的场景中,它从id 1中选择40
DECLARE @Data table (Id int identity(1,1)
, SKU varchar(10)
, QtyRec INT
,QtyDis INT
)
DECLARE @Qty int = 20
INSERT @Data VALUES
('001A', 50 ,0),
('001A', 50,10 ),
('001A', 50 ,20),
('001A', 50,0)
;WITH sumqty AS
(
SELECT *, SUM(QtyRec) OVER (PARTITION BY SKU ORDER BY Id) AS TotalQty FROM @Data
)
,takeqty AS (
SELECT *,
CASE
WHEN @Qty >= TotalQty THEN QtyRec
ELSE @Qty - ISNULL(LAG(TotalQty) OVER (PARTITION BY SKU ORDER BY Id), 0)
END AS TakeQty
FROM sumqty
)
SELECT * FROM takeqty WHERE TakeQty > 0
我想您应该按
QtyDis DESC
订购,而不是按Id ASC
订购:
DECLARE @Data TABLE
(
Id INT IDENTITY(1, 1) ,
SKU VARCHAR(10) ,
QtyRec INT ,
QtyDis INT
)
DECLARE @Qty INT = 70
INSERT @Data
VALUES ( '001A', 50, 0 ),
( '001A', 50, 10 ),
( '001A', 50, 20 ),
( '001A', 50, 0 );
WITH sumqty
AS ( SELECT * ,
SUM(QtyRec - QtyDis) OVER ( PARTITION BY SKU ORDER BY QtyDis DESC, Id ) AS TotalQty
FROM @Data
),
takeqty
AS ( SELECT * ,
CASE WHEN @Qty > TotalQty THEN TotalQty
ELSE @Qty
- ISNULL(LAG(TotalQty) OVER ( PARTITION BY SKU ORDER BY QtyDis DESC, Id ),
0)
END AS TakeQty
FROM sumqty
)
SELECT *
FROM takeqty
WHERE TakeQty > 0
输出:
Id SKU QtyRec QtyDis TotalQty TakeQty
3 001A 50 20 30 30
2 001A 50 10 70 40
从id 3中取50,从id 3中取30,因为减去QtyRec和QtyDis后的剩余量是30。