Как выделить количество Pick из одного столбца в другой столбец в SQl Server - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь выделить количество от общего количества, а оставшееся количество должно быть присвоено последней строке. То, что я делаю, у меня есть два продукта (CEOO1, CEOO1) с количеством 50 каждый, и он может назначить 15 для каждой коробки. Я делю Количество на Размер и генерирую строки, используя spt_values, и хочу выделить для блока на основе размера, и в моем случае 3 строки назначат 15, а последние строки назначат 5 для Продукта CEOO1. То, что я попробовал, ниже.

DECLARE @TempTable TABLE (
ID INT IDENTITY (1,1) PRIMARY KEY,
ProductCode  NVARCHAR(50) NULL,
Quantity    INT NULL,
Size        INT NULL

)

INSERT INTO @TempTable VALUES('CEOO1',50,15)
INSERT INTO @TempTable VALUES('CEOO2',50,15)

SELECT ProductCode, 
        Quantity, 
        Size, 
        Quantity - SUM(Size) OVER (PARTITION BY ProductCode ORDER BY ProductCode ROWS UNBOUNDED PRECEDING) AS Remaing,0 Allocated  FROM (
SELECT * FROM (
SELECT ProductCode,Quantity,Size, CEILING(CAST(Quantity AS float)/CAST(Size AS FLOAT)) TotalRows FROM @TempTable
) AS detail
CROSS APPLY 
                    (SELECT     DISTINCT number 
                    FROM        master.dbo.spt_values 
                    WHERE       number>0 AND number<=detail.TotalRows
                    ) RowGen    

) AS ProductAllocation

Это дает результат вроде

enter image description here

но я хочу вот так

enter image description here

1 Ответ

0 голосов
/ 31 марта 2020

Я немного изменил ваш запрос. В основном добавлен лог c для расчета Allocated. Я использую number в порядке убывания, так что когда number = 1, это последняя строка

SELECT  
    t.ProductCode,  
    t.Quantity, 
    t.Size,
    Remaining   = t.Quantity - SUM(t.Size) OVER (PARTITION BY t.ProductCode 
                                                     ORDER BY RowGen.number DESC),
    Allocated   = CASE  WHEN    RowGen.number <> 1
                        THEN    t.Size
                        ELSE    t.Quantity 
                              - SUM(t.Size) OVER (PARTITION BY t.ProductCode 
                                                      ORDER BY RowGen.number DESC) 
                              + t.Size
                        END
FROM    @TempTable AS t
        CROSS APPLY 
        (
            SELECT  DISTINCT number 
            FROM    master.dbo.spt_values 
            WHERE   number > 0 
            AND     number <= CEILING(t.Quantity * 1.0 / t.Size)
        ) AS RowGen    
ORDER BY t.ProductCode, RowGen.number DESC

/* Result 
CEOO1   50  15  35  15
CEOO1   50  15  20  15
CEOO1   50  15  5   15
CEOO1   50  15  -10 5
CEOO2   50  15  35  15
CEOO2   50  15  20  15
CEOO2   50  15  5   15
CEOO2   50  15  -10 5
*/
...