Добавить значения полей столбца в той же строке? - PullRequest
0 голосов
/ 17 ноября 2018

Я работаю с SQL на db2.

Таблица отгрузки:

 +--------+------+
 | 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 | 
+---------+-------------+-----------------+---------------+

Я не могу понять, как связать вес отправления с весом предмета.Как только я это сделаю, я могу присоединиться к стоимости доставки.

Я пытался использовать «ГДЕ> = Вес отправления», но это дает мне все возможности, и я просто хочу выбрать лучший вариант, который либо равен чемили следующий величайший.Я не очень хорош в объяснении этого, но я надеюсь, что вы понимаете, что я имею в виду, глядя на итоговую таблицу, которую я хочу.

Спасибо!

1 Ответ

0 голосов
/ 17 ноября 2018

Что ж, вы можете использовать коррелированный подзапрос, чтобы получить вес, а затем 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...