将拣选数量从一列分配到另一列

Allocated Pick quantity from one column to other column

我正在尝试从总数量中分配挑选数量,剩余数量应分配到最后一行。我在做什么我有两个产品(CEOO1,CEOO1),每个产品的数量为 50,它可以为每个盒子分配 15 个。我将数量划分为大小并使用 spt_values 生成行,并希望根据大小分配给盒子,在我的例子中,3 行将分配 15,最后一行将为产品 CEOO1 分配 5。我试过的是下面。

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

它给出的结果类似于

但我想要这样

我对您的查询做了一些修改。主要是增加了计算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
*/