【问题标题】:SQL - update each row of a column using while loopSQL - 使用 while 循环更新列的每一行
【发布时间】:2018-07-19 08:28:21
【问题描述】:

我原来的表格是这样的:

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)

我想根据“量”灵活使用以上3种不同的费率来获得最低的成本。例如,在第 4 周,“剩余体积”最初是 75,我应该应用一个 40' 容器成本来加载一部分体积。那么“剩余体积”是 30,我应该应用 20' 容器成本来加载其余部分。那么“剩余量”是 5,我应该应用宽松的运输价格,一直这样直到“剩余量”=0。这样做会给我最好的组合,以最小化每周的成本。因此,需要对“剩余音量”应用一个 while 循环,它可以指示如何选择不同的速率。

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

   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

【问题讨论】:

  • 循环绝对不是处理这个问题的最佳方式。但我不能提供任何真正的建议,因为这太模糊了。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • @Jack 我想我遵循您的逻辑,但是您的方法有太多变化。从逻辑上讲,我不同意你的例子,比如一周是 3 - '3 80 rateC + rateB + rateA' - 这不应该是 rateC + rateC 吗?这些是能够提供帮助所需的详细信息。
  • 抱歉打错了。 40' 集装箱的最大容量限制实际上是 45。

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


【解决方案1】:

如果案例是固定的并且数量很少,则以下方法可以正常工作(无论如何,对于 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 情况,它将不会尝试评估第四个、第五个等。我不知道这是不是其他数据库也是如此。

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2015-08-13
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多