2015-05-07 2 views
0

Черт возьми, возможно, «соединение» даже не связано. Я вышел из своей лиги sql здесь. Может кто-то пожалуйста, помогите мне ж/следующее:SQL Join w/some Math, брошенный в

Таблица A

ItemId ItemLookup Price 
------- ---------- ----- 
    1  123456  10.00 
    2  234567  7.00 
    3  345678  6.00 

Таблица B

ItemId Location  Qty  QtyOnHold 
------- ---------- -----  --------- 
    1  1    26  20 
    2  1    0   0 
    3  1    12  6 
    1  2    4   0 
    2  2    2   1 
    3  2    16  8 

Что я в надежде получить что-то, что выглядит как

ItemLookup, Price, (qty minus qtyonhold for loc1), (qty minus qtyonhold for loc2) 
or 123456, 10.00,   6,        4 

Большое спасибо за любое направление, которое вы можете предоставить.

+0

Интересно, хотите ли вы больше столбцов 1,2 и 3 ... так один –

+0

Сначала попробуйте его без соединения (ItemId вместо ItemLookup и Price). Но вы не можете преобразовать строки в столбцы с помощью JOIN. – Marki555

ответ

0

Вы можете использовать условную агрегацию и join:

select a.ItemLookup, 
     sum(case when Location = 1 then Qty - QtyOnHold end) as Location1, 
     sum(case when Location = 2 then Qty - QtyOnHold end) as Location2 
from tableb b join 
    tablea a 
    on b.ItemId = a.ItemId 
group by a.ItemLookup; 
0

Somthing как этот

select tablea.* , 
(select (qty- QtyOnHold) as qty from tableb where ItemId = tablea.ItemId ans Location = 1) as qtyl1, 
(select (qty- QtyOnHold) as qty from tableb where ItemId = tablea.ItemId ans Location = 2) as qtyl2 
from tablea 
0

Это предполагает, что есть только одна строка в TableB для каждого ItemID + Location комбинации. Это в основном просто «свод», вы можете изучить различные способы сделать это в MySQL here.

SELECT ItemLookup, Price, 
    MAX(IF(Location = 1, Qty-QtyOnHold, 0)) avail1, 
    MAX(IF(Location = 2, Qty-QtyOnHold, 0)) avail2 
FROM TableA AS a 
JOIN TableB AS b ON a.ItemId = b.ItemId 
GROUP BY a.ItemId 
0

Мне кажется, что может быть возможно иметь переменное количество мест для каждого элемента. Если это так, вам нужна сводная функция для преобразования/конкатенации нескольких строк в столбец. Вот пример с функцией GROUP_CONCAT в MySQL:

select a.itemlookup,a.price,group_concat('loc ',location,'=',b.x order by location) as qty_minus_qtyonhold 
    from tablea a,(select itemid,location,qty-qty_onhold x from tableb 
    group by itemid,location) as b 
    where a.itemid = b.itemid 
    group by 1 

Вы получите результат, как этот:

itemlookup price qty_minus_qtyonhold 
---------- ------ ------------------ 
    123456  10.00 loc 1=6,loc 2=4 
    234567  7.00 loc 1=0,loc 2=1 
    345678  6.00 loc 1=6,loc 2=8 

Не уверен, что СУБД вы используете, но есть подобные альтернативы для Oracle и SQL Server

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