SQL - 使用while循环更新列的每一行

时间:2018-02-08 17:09:01

标签: sql-server while-loop sql-update

我的原始表格如下:

week   volume   cost
1        11     null
2        32     null
3        80     null
4        75     null
5        50     null
...      
51       28     null

我想通过应用更智能的规则来更新费用字段,如下所示:

if volume < 13, then use a rateA (loose shipment price) 
if volume >= 13 and < 25, then use a rateB (20' container price)
if volume >= 25 and < 45, then use a rateC (40' container price)

我希望根据&#34;音量&#34;灵活使用3种不同的费率,以获得最低的成本。例如,在第4周,&#34;剩余音量&#34;最初是75,我应该应用一个40&#39容器成本来加载一部分卷。那么&#34;剩余的音量&#34;是30,我应该用一个20&#39的容器成本来装载剩下的一部分。那么&#34;剩余的音量&#34;是5,我应该应用松散的运费价格,继续这样做,直到&#34;剩余的货量&#34;这样做会给我最好的组合,以最大限度地降低每周的成本。因此,需要将while循环应用于&#34; REMAINING VOLUME&#34;这可以说明如何选择不同的费率。

最终更新的表应如下所示:

   week    volume    cost
    1        11      rateA
    2        32      rateB + rateA
    3        80      rateC + rateB + rateA
    4        75      rateC + rateB + rateA
    5        50      rateC + rateA
    ...      
    51       28      rateB + rateA

1 个答案:

答案 0 :(得分:0)

如果案例是固定的并且它们的数量很少,以下方法完全正常(无论如何,使用SQL Server;我不知道其他数据库 - 请参阅下面的注释)......

UPDATE  #Orders
SET     [Cost] = CASE
            WHEN 0 * 44 + 0 * 24 + 1 * 12 >= [Volume] THEN 'rateA'
            WHEN 0 * 44 + 1 * 24 + 0 * 12 >= [Volume] THEN 'rateB'
            WHEN 0 * 44 + 1 * 24 + 1 * 12 >= [Volume] THEN 'rateB + rateA'
            WHEN 1 * 44 + 0 + 24 + 0 * 12 >= [Volume] THEN 'rateC'
            WHEN 1 * 44 + 0 + 24 + 1 * 12 >= [Volume] THEN 'rateC + rateA'
            WHEN 1 * 44 + 1 + 24 + 0 * 12 >= [Volume] THEN 'rateC + rateB'
            WHEN 1 * 44 + 1 + 24 + 1 * 12 >= [Volume] THEN 'rateC + rateB + rateA'
            ELSE 'too big'
        END
FROM    #Orders
;

不需要循环!

注意案件的直接进展;如果需要,可以扩展模式以包含更大的权重。

这适用于SQL Server,因为您可以保证使用第一个匹配条件,因此如果它匹配第三个WHEN情况,它将不会尝试评估第四个,第五个等。我不知道这是否是对于其他数据库都是如此。