【发布时间】:2021-10-18 08:54:24
【问题描述】:
我要求将数量限制在一定水平。以下数据已分区,还提供了行号。请参考下面这是表格中的当前数据
但是输出应该是这样的。请参考下文。
目前的卡车容量为 16 个。但是,如果您看到分区级别的总分配数量为 17。所以我们需要在行级别从最终分配数量中动态减去额外的 1 个数量,最好从行号 1..2..3 像这样。我曾尝试使用 while 循环进行总计,但没有运气
到目前为止我所做的尝试
DECLARE @GroupCount INT
SET @GroupCount = (SELECT MAX(PartitionNum) FROM Allocation_Table)
DECLARE @RowCount INT
-- Declare an iterator
DECLARE @I INT,@J int
--Initialize the iterator
SET @I =1
WHILE (@I <= @GroupCount)
BEGIN
SET @RowCount = (SELECT MAX(RowNumber) FROM Allocation_Table WHERE PartitionNum=@I)
DECLARE @BS float=0
SELECT @BS = cast([Remainder Qty to be dropped] as float) FROM Allocation_Table WHERE PartitionNum=@I
SET @J = 1
WHILE (@J <= @RowCount)
BEGIN
--PRINT @I
declare @BV float, @Qty float,@flg bit,@Ibs float, @EV float
SELECT @Qty=[Final Allocation Qty] FROM Allocation_Table WHERE PartitionNum=@I and RowNumber=@J
set @IBS=@BS
SET @BS=case when (@BS>=@Qty) then @BS-@Qty else @BS end
SET @flg=case when (@IBS>=@Qty) then 1 when (@IBS<@Qty) and @IBS>0 then 1 else 0 end
set @BS= case when (@IBS<@Qty) then 0 else @BS end
update Allocation_Table set BS_Cal=@BS ,Flag=@flg WHERE RowNumber = @J and PartitionNum=@I
SET @J = @J + 1
END
SET @I = @I + 1
【问题讨论】:
-
不幸的是,您不能使用窗口(和分区)聚合进行这种聚合,您需要使用迭代;最有可能患有 rCTE。
-
根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
-
您最初是如何得到
Final Allocation Qty的4,9,4的?为什么不先把它改正,而不是以后再做修复 -
@Squirrel - 不幸的是,这首先无法纠正。该数量是系统建议的。但我们需要根据卡车容量限制它
-
@DaleK 发布了我目前尝试过的代码
标签: sql sql-server tsql sql-server-2012