2017-11-19 8 views
0

各サプライヤから最も安い製品を見つける必要があります。 私が持っているテーブルは、tb_supplier、tb_consumer、tb_offers、tb_requests、tb_transactions、およびtb_productsです。各サプライヤが一番安い製品を提供するSQLクエリ

私は現在、最も安い製品、サプライヤー、金額のみを表示しています。 EVERYサプライヤーのための最も安い方法を見つけるにはどうすればいいですか?製品を想定し

SELECT Tb_Product.Name, Tb_Supplier.Name, Tb_Offers.Price as 'Price' 
FROM Tb_Product, Tb_Supplier, Tb_Offers 
WHERE Tb_Product.Prod_ID = Tb_Offers.Prod_ID 
    AND Tb_Offers.Supp_ID = Tb_Supplier.Supp_ID 
    AND Tb_Offers.Price = (SELECT Min(Tb_Offers.Price) 
         FROM Tb_Offers) 

おかげ

+0

すでに 'min'のようにサブクエリを作成してください。サプライヤの名前でグループ化し、サプライヤの名前に戻って参加します。 – HoneyBadger

答えて

0

は、いくつかの供給業者によって提供されており、各サプライヤは、我々は、スキーマを次ているいくつかの製品を提供しています。

declare @prod table(id int, name varchar(50)) 
declare @supplier table(id int, name varchar(50)) 
declare @offer table(prodId int, supplierId int, price float) 

--populate tables 
insert @prod (id,name) values 
(1,'A'),(2,'B'),(3,'C') 

insert @supplier (id,name) values 
(1,'A'),(2,'B'),(3,'C') 

insert @offer(prodId,supplierId,price) values 
(1,1,10),(1,2,8),(2,1,12),(2,3,11),(3,1,15),(3,3,20) 

-- use common table expression to sort offers by price 
;with cte as (
select prodId, supplierId, price, 
row_number() over(partition by prodId order by price) rn 
from @offer 
) 
select prodId, p.name, supplierId, s.name, price --beautify with names 
from cte 
inner join @prod p on cte.prodId=p.id 
inner join @supplier s on cte.supplierId=s.id 
where rn = 1 --only first (cheapest) price 

--result returned 
prodId name supplierId name price 
1  A  2   B  8 
2  B  3   C  11 
3  C  1   A  15 

サイドノート:カンマANSI92に応じて不要とみなさテーブル構文のリストを分離しました。ちょうど25年前

関連する問題