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。