2016-04-13 26 views
-1

Burada yeniyim ve gönderim olduğu yerlerden miktar çıkarmak zorunda olduğum senaryo ile geliyorum. Mesela ben 40 Miktar sahip çıkarDaha fazla irsaliye miktarı ile satınalma miktarını dışarı çıkarın

ID SKU QtyRec QTYDisp 
1 001A 50  0 
2 001A 50  10 
3 001A 50  20 
4 001A 50  0 

aşağıdaki tabloya sahiptir. İlk o zaman 1 veya 4'ten sonra id 2 Sevk Miktarı 2'de sonra 3'te büyüktür Çünkü Ama benim şimdiki senaryoda o Bence sen id 1.

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 

cevap

0

den 40 toplamaksa id 3'ten almalı Id ASC tarafından QtyDis DESC ve vermeyerek istenmesi gerekir:

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 

Çıktı:

Id SKU  QtyRec QtyDis TotalQty TakeQty 
3 001A 50  20  30   30 
2 001A 50  10  70   40 
+0

o id 3'ten 50'ye alıyor o id 3'ten 30 almalıdır olarak çünkü subtrac sonra kalan miktar QtyRec ve QtyDis değeri 30'dur. –

+0

@azeemhafeez, düzenlemelere bakın ... –

İlgili konular