Sql 是否在同一行中添加列字段值?

Sql 是否在同一行中添加列字段值?,sql,database,db2,Sql,Database,Db2,我在db2上使用SQL 装运表: 项目表: 我想使用重量将适当的运输成本与物品相关联。因此,如果项目的重量与装运重量相关联,则等于或大于装运重量表中的下一个重量 在内部联接之后,我希望生成的表是什么,所有内容都是: +---------+-------------+-----------------+---------------+ | Item ID | Item Weight | Shipping Weight | Shipping Cost | +---------+----------

我在db2上使用SQL

装运表:

项目表:

我想使用重量将适当的运输成本与物品相关联。因此,如果项目的重量与装运重量相关联,则等于或大于装运重量表中的下一个重量

在内部联接之后,我希望生成的表是什么,所有内容都是:

+---------+-------------+-----------------+---------------+
| 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>=装运重量,但这给了我所有的可能性,我只想要最好的一个,或者等于或次之。我不擅长解释这一点,但我希望你理解我的意思,通过查看我想要的结果表


谢谢

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

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;
可能funner方法使用窗口函数:

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)

谢谢。MINs.weight和其中s.weight>=i.weight部分是我所需要的。干杯旁注:对于正数,我通常的建议是包含下限,不包含上限,也就是说,也就是说,下限,无论存储边界的方向如何,为了便于使用,我建议创建一个视图,或者创建一个可能有助于提高速度的视图,尽管源表可能足够小,但这并不重要。
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)