2016-04-19 13 views
0

リンクテーブルから合計を取得しようとしています。3つのリンクテーブル間の合計SQL Server

注文

OrderID  LocationID OrderDate 
100   1   1/1/2000 
200   2   1/2/2000 

OrderedItems

ID   OrderID  ItemID 
1   100   1 
2   200   2 
3   200   2 
4   100   3 

のOrderItem

ItemID  ItemName Cost 
1   Mobile1  100.00 
2   Mobile2  200.00 
3   Mobile3  300.00 

Orderテーブルは事実上OrderedItemsのグループです。 OrderedItemsの各行は、にItemIDでリンクしています。

注文総額の下のクエリに列を追加しようとしています。

Order Number Location Date Ordered Order Total 
------------------------------------------------------- 
100    Sydney  1/1/2000  400 
200    Brisbane 1/2/2000  400 

私が持っている現在のクエリは次のようになります。

SELECT 
    Order.OrderID AS [Order Number], 
    OL.Name AS [Location], 
    Order.OrderDate AS [Date Ordered] 
FROM 
    Order 
LEFT JOIN 
    Office_Locations AS OL ON OL.id = Order.LocationID 

私は値を追加するために3つのテーブルによってリンクさせる必要が午前しかしthis linkに従うことをしようとしています。

hepはすばらしいでしょう!あなたは合計Costを取得するためにSUMを使用する必要が

+0

これはどちらか、必ずしも間違っていないが、通常ではない非定型スキーマ...です。アイテムを繰り返すよりも、OrderedItemsテーブルにqtyフィールドを持つ方がずっと普通です。 –

答えて

2

3つのテーブルから合計が見つかりません。 からというテーブル(OrderItemテーブル)の合計が見つかりました。唯一のやり方は、JOINGROUP BY式を正しく実行して、その列を使用可能にすることです。

SELECT o.OrderID As [Order Number], l.Name As Location 
    , o.OrderDate As [Date Ordered], SUM(i.Cost) As [Order Total] 
FROM [Order] o 
INNER JOIN Office_Locations l on l.id = o.LocationID 
INNER JOIN OrderedItems oi on oi.OrderID = o.OrderID 
INNER JOIN OrderItem i ON i.ItemID = oi.ItemID 
GROUP BY o.OrderID, l.Name, o.OrderDate 

SQLFIDDLE

1

:繰り返すよりも、

SQL Fiddle

SELECT 
    [Order Number] = o.OrderID, 
    Location  = ol.Name, 
    [Date Ordered] = o.OrderDate, 
    [Order Total] = SUM(i.Cost) 
FROM [Order] o 
INNER JOIN OrderedItems oi 
    ON oi.OrderId = o.OrderId 
INNER JOIN OrderItem i 
    ON i.ItemID = oi.ItemID 
LEFT JOIN Office_Locations ol 
    ON ol.id = o.LocationID 
GROUP BY 
    o.OrderID, o.OrderDate, ol.Name 

ジョエルCoehoornでコメントしたように、それはOrderedItems表にquantityフィールドを持つことがより正常ですそれら。彼のアドバイスに続いて、あなたのOrderedItemsテーブルは次のようになります。

ID   OrderID  ItemID Quantity 
1   100   1  1 
2   200   2  2 
3   100   3  1 

追加注:読みやすさを向上させるために

  • 使用有意義別名。
  • 予約語をオブジェクト名として使用しないようにします。つまり、OrderOrderHeaderと名前を変更できます。
関連する問題