【问题标题】:Add column field values in the same row?在同一行中添加列字段值?
【发布时间】:2018-11-16 21:36:38
【问题描述】:

我在 db2 上使用 SQL。

运输表:

 +--------+------+
 | Weight | Cost |
 +--------+------+
 |      2 |    5 |
 |      5 |   10 | 
 |     10 |   15 | 
 |     30 |   45 |  
 |     50 |   80 |  
 +--------+------+

物品表:

  +---------+--------+
  | Item ID | Weight |  
  +---------+--------+
  |       1 |     34 |  
  |       2 |      4 | 
  |       3 |      9 |    
  |       4 |      5 |  
  |       5 |     16 |    
  +---------+--------+

我想使用重量将适当的运费与商品相关联。因此,如果该项目的重量将关联到等于该重量或下一个大于运输重量表中的重量的运输重量。

我希望我的结果表在 INNER JOIN 之后是:

+---------+-------------+-----------------+---------------+
| Item ID | Item Weight | Shipping Weight | Shipping Cost | 
+---------+-------------+-----------------+---------------+
|       1 |          34 |              50 |            80 |   
|       2 |           4 |               5 |            10 |  
|       3 |           9 |              10 |            15 |  
|       4 |           5 |               5 |            10 |  
|       5 |          16 |              30 |            45 | 
+---------+-------------+-----------------+---------------+

我无法弄清楚如何将运输重量与物品重量相关联。一旦我这样做了,我就可以加入运费。

我尝试使用“WHERE >= Shipping Weight”,但这给了我所有的可能性,我只想要一个等于或次之最好的最好的。我不擅长解释这一点,但我希望您通过查看我想要的结果表来理解我的意思。

谢谢!

【问题讨论】:

  • 旁注:我通常对正数的建议是“下限包含,上限不包含”(即lower <= actual weight < upper - 与您在此处显示的相反)。这样做的原因是处理所有数字的范围:考虑如果任何项目的重量30.00001 会发生什么 - 它变得更容易推理(您当前正在存储上限 - 为什么顶部的一个被结转? )/查询,为其编写合法副本。在这种情况下,您将存储下限,这意味着最高汇率只是正常最后汇率的一部分。
  • 此外,无论您存储边界的哪个方向,为了便于使用,我建议创建一个视图或materialized query table(这也可能有助于提高速度,尽管源表可能足够小应该没关系)。

标签: sql database db2


【解决方案1】:

好吧,您可以使用相关子查询来获取权重,然后使用join 来获取相关成本:

select i.*, s.*
from (select i.*,
             (select min(s.weight)
              from shipping s
              where s.weight >= i.weight
             ) as shipping_weight
      from items i
     ) i join
     shipping s
     on i.shipping_weight = s.weight;

也许更有趣的方法使用窗口函数:

select i.*, s.*
from items i join
     (select s.*, lag(weight) over (order by weight) as prev_weight
      from shipping s
     ) s
     on i.weight <= s.weight and
        (i.weight > prev_weight or prev_weight is null)

【讨论】:

  • 非常感谢。我需要的是“MIN(s.weight)”和“WHERE s.weight >= i.weight”部分。干杯!
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2021-07-22
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多