2015-10-19 4 views
0

У меня есть 4 таблицы, в которые я хочу присоединиться, чтобы отображать проданные предметы и возвращенные предметы. Проблема, с которой я сталкиваюсь, заключается в том, что проданные и возвращенные элементы находятся в одной таблице, и мне не удается вернуть 0 для столбца «Возврат», когда товар продается без возврата и 0 для столбца «Продано», когда товар возвращается без продажи. Вот что я пытаюсь сделать,Таблица разделения по значению столбца

Местоположение

LocationID LocationName 
    1   NY 
    2   LA 
    3  Chicago 

Предметы

ItemID ItemName 
    A Sandwich 
    B Salad 
    C  Wrap 

Поставки

DeliveryID LocationID 
    1   1 
    2   2 
    3   3 
    4   1 

DeliveryRecords

RecordID DeliveryID ItemID Quantity RecordType 
    1   1  A  3  SOLD 
    2   1  B  4  SOLD 
    3   1  C  5  SOLD 
    4   1  C  2  RETURN 
    5   2  A  3  SOLD 
    6   2  B  2  SOLD 
    7   3  B  2  SOLD 
    8   3  C  3  SOLD 
    9   4  A  1  RETURN 

И я хочу, чтобы мой запрос, чтобы вернуться,

Location DeliveryID Item  Sold Returned 
    NY   1  Sandwich  3  0 
    NY   1   Salad  4  0 
    NY   1   Wrap  5  2 
    LA   2  Sandwich  3  0 
    LA   2   Salad  2  0 
Chicago  3   Salad  2  0 
Chicago  3   Wrap  3  0 
    NY   4   Wrap  0  1 
+1

Каков запрос что вы пробовали? –

ответ

2

Я думаю, что вы просто хотите условную агрегацию (после того, как связка присоединяется):

select l.locationname, dr.deliveryid, i.itemname, 
     sum(case when dr.recordtype = 'SOLD' then quantity else 0 end) as sold, 
     sum(case when dr.recordtype = 'RETURN' then quantity else 0 end) as returned 
from deliveryrecords dr join 
    deliveries d 
    on dr.deliveryid = d.deliveryid join 
    location l 
    on d.locationid = l.locationid join 
    items i 
    on dr.itemid = i.itemid 
group by l.locationname, dr.deliveridy, i.itemname; 
+0

Спасибо, это прекрасно! –

1

Использование JOIN и SUM:

SQL Fiddle

SELECT 
    l.LocationName, 
    dr.DeliveryID, 
    i.ItemName, 
    [Sold]  = SUM(CASE WHEN dr.RecordType = 'SOLD' THEN dr.Quantity ELSE 0 END), 
    [Returned] = SUM(CASE WHEN dr.RecordType = 'RETURN' THEN dr.Quantity ELSE 0 END) 
FROM DeliveryRecords dr 
INNER JOIN Items i 
    ON i.ItemID = dr.ItemId 
INNER JOIN Deliveries d 
    ON d.DeliveryID = dr.DeliveryID 
INNER JOIN Locatins l 
    ON l.LocationID = d.LocationId 
GROUP BY 
    dr.DeliveryID, l.LocationName, i.ItemName 
Смежные вопросы