2017-09-09 8 views
1

私は、Order、Order_Item、Item、SupplierおよびSupplier_Itemというテーブルを持つ簡単な注文データベースを持っています。アイテムは、アイテムを異なる価格で一覧表示する複数のサプライヤを持つことができます。SQL Server - 最も安いサプライヤ価格を得る

私は過去7日間の注文とそのアイテムを見て、その注文アイテムの最も安いサプライヤー価格を返すクエリを作成しようとしています。

私はこれを試みた:3000行(結果が不正確であるが、それは各注文アイテム(約100)の行を返す必要があり

SELECT O.Order_Id, O.Site_Id, O.Order_Date, 
      OI.Item_ID, OI.Quantity, OI.Supplier, 
      I.Item_Name, I.Category, 
      MIN(SI.Price) AS Price , SI.Supplier_ID, 
      S.Supplier_Name 
    FROM [Order_Item] OI 
    INNER JOIN [Order] O ON O.Order_ID = OI.Order_ID 
    INNER JOIN Item I ON OI.Item_ID = I.Item_ID 
    INNER JOIN Supplier_Item SI ON SI.Item_ID = I.Item_ID 
    INNER JOIN Supplier S ON S.Supplier_ID = SI.Supplier_ID 
    WHERE O.Order_Date > DATEADD(DAY, - 7, GETDATE()) 
    GROUP BY O.Order_ID, O.Site_ID, O.Order_Date, OI.Item_ID, OI.Quantity, 
      OI.Supplier, I.Item_Name, I.Category, SI.Supplier_ID, 
      S.Supplier_Name 

が、各注文項目とサプライヤの価格行を返します)。

誰かが私がどこに間違っているのかを示すことができれば、大きな助けになるでしょう。

答えて

1

項目

SELECT O.Order_Id, 
     O.Site_Id, 
     O.Order_Date, 
     OI.Item_ID, 
     OI.Quantity, 
     OI.Supplier, 
     I.Item_Name, 
     I.Category, 
     SI.Price, 
     SI.Supplier_ID, 
     SI.Supplier_Name 
    FROM [Order_Item] OI 
INNER JOIN [Order] O 
    ON O.Order_ID = OI.Order_ID 
INNER JOIN Item I 
    ON OI.Item_ID = I.Item_ID 
INNER JOIN (SELECT si_a.item_id, 
        s.supplier_id, 
        s.supplier_name, 
        si_a.price, 
        ROW_NUMBER() OVER (PARTITION BY si_a.item_id ORDER BY si_a.price) AS cheapest 
       FROM supplier_item si_a 
       JOIN supplier s 
       ON si_a.supplier_id = s.supplier_id 
      ) si 
    ON si.item_id = i.item_id 
    AND si.cheapest = 1 
WHERE O.Order_Date > DATEADD(DAY, - 7, GETDATE()) 
+0

ありがとう、それは私が初めて見たOVER - PARTITION B Y、それはかなり分かりやすい –

1

他に問題がある場合は、結合が正しく表示されません。特に:

INNER JOIN Supplier_Item SI ON SI.Supplier_ID = I.Item_ID 

私は推測していた場合、これは次のようになります。

ON SI.Item_ID = I.Item_ID 
+0

注文し、それを接続し、その後、各項目の最も安い業者の価格を決定するようにしてくださいそれは可能性がありますように見える –

+0

これは、今、すべてのサプライヤー価格を返す、それを指摘していただきありがとうございます、私は私の質問を更新します –

関連する問題