将拣选数量从一列分配到另一列
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
*/
我正在尝试从总数量中分配挑选数量,剩余数量应分配到最后一行。我在做什么我有两个产品(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
*/