我有一个简单的订购数据库,包括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行)返回一行。
如果有人能告诉我出错的地方,那将是一个很大的帮助。
答案 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())