2015-04-20 2 views
1

У меня есть таблица в sql, которая имеет следующие столбцы. Первая таблица показывает количество, которое было получено, а вторая таблица - количество, которое было отправлено. Второй таблице дает нам в общей сложности 70 Кол-во для SKU 1 и QTY 60 для SKU 2.В SQL, как вы будете распределять вычет в каждой строке на основе емкости каждой строки?

Received Table 
Id Sku Quantity 
1 1 30  
2 1 20 
3 1 100 
4 2 600 

Shipped Table 
Id Sku Quantity 
1 1 50 
2 1 20 
3 2 60 

Мне нужен вид, который показывает, сколько количество было отгружено по отношению к полученной таблице. Теперь я хочу, чтобы распределить общее количество каждого SKU в каждой строке в таблице, которая должна дать мне следующий результат:

ID Sku Quantity Used Remaining 
1 1  30   30  0 
2 1  20   20  0 
3 1  100  20  80 
4 2  600  60  540 
+0

Какая СУБД вы используете? Postgres? Oracle? –

+0

Я использую SQL Server 2008 R2. – Lance

+0

@ GordonLinoff, да, вы правы. Это инкрементирующее целое число. Позвольте мне изменить таблицы. – Lance

ответ

2

Вам нужна кумулятивные суммы и агрегацию. Ниже делает накопленную сумму количества наряду с общей отгруженной в одном ряду:

select r.*, cume.cumequantity, coalesce(s.shipped ,0) 
from received r cross apply 
    (select sum(r2.quantity) as cumequantity 
     from received r2 
     where r2.sku = r.sku and r2.id <= r.id 
    ) cume left join 
    (select s.sku, sum(quantity) as shipped 
     from shipped s 
     group by s.sku 
    ) s 
    on r.sku = s.sku 

Это дает основную информацию, необходимую для ответа на ваш вопрос. Остальное является просто арифметическим и логическим:

with rs as (
     select r.*, cume.cumequantity, coalesce(s.shipped ,0) 
     from received r cross apply 
      (select sum(r2.quantity) as cumequantity 
      from received r2 
      where r2.sku = r.sku and r2.id <= r.id 
      ) cume left join 
      (select s.sku, sum(quantity) as shipped 
      from shipped s 
      group by s.sku 
      ) s 
      on r.sku = s.sku 
    ) 
select rs.ID, rs.Sku, rs.Quantity, 
     (case when rs.cumequantity <= rs.shipped 
      then rs.quantity 
      when rs.cumquantity > rs.shipped and 
        rs.cumquantity - rs.quantity < rs.shipped 
      then rs.shipped - rs.cumquantity - rs.quantity 
      else 0 
     end) as used, 
     (case when rs.cumequantity <= rs.shipped 
      then 0 
      when rs.cumequantity > rs.shipped and 
        rs.cumequantity - rs.quantity < rs.shipped 
      then rs.quantity - (rs.shipped - rs.cumequantity - rs.quantity) 
      else rs.quantity 
     end) as remaining 
from rs 
+0

Это сработало. Благодарю. – Lance

Смежные вопросы