SQL Server - 获得最便宜的供应商价格

时间:2017-09-09 15:49:16

标签: sql sql-server

我有一个简单的订购数据库,包括Order,Order_Item,Item,Supplier和Supplier_Item。物品可以有多个供应商,这些供应商都以不同的价格列出物品。

我正在尝试编写一个查询过去7天订单及其商品的查询,并返回该订单商品最便宜的供应商价格。

我试过这个:

   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

但是结果不正确,它应该为每个订单商品返回一行(大约100个),但它会为每个订单商品和供应商价格(3000行)返回一行。

如果有人能告诉我出错的地方,那将是一个很大的帮助。

2 个答案:

答案 0 :(得分:1)

无论您遇到什么其他问题,您的联接看起来都不正确。特别:

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

如果我不得不猜测,那应该是:

ON SI.Item_ID = I.Item_ID

答案 1 :(得分: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())