2016-12-05 5 views
0

私はSQLでMIN関数を使用しようとしていますが、私はMIN行だけでなく多くの行を取得し続けます。sql - MIN関数を使用する

私は

SELECT 
    P.ProductID, 
    MIN(Price) AS SmallestOrderPrice 
FROM Products P 
GROUP BY ProductID; 

は私がすべての価格からの分の価格を持っているだけの行を取得したいこのクエリを実行し、このチュートリアルhttp://www.w3schools.com/SQl/trysql.asp?filename=trysql_func_min

を使用していて、それが製品を対応です。複数の商品に同じ価格がある場合は、両方の商品を返品していただきたいと思います。

+0

*あなたは何を意味していますか?私はたくさんの行*を得続けていますか? 1つの製品につき1つの行を取得する必要があります。多くの製品をお持ちの場合、明らかに多くの行が表示されます。 –

+0

結果としてあなたは何を見たいですか?あなたは価格が最も低い製品だけを望んでいますか? – Siyual

+0

商品ごとに最低価格を取得する必要があります。 eahc返されるPRODUCTIDはuniqでなければならず、各製品価格の最小値を取得しています。 MINの価格を求めて、それがどの製品であるか知っていれば、別のクエリが必要になります。 – xQbert

答えて

2

おそらく、すべての製品にproductidと最小価格が必要です。

窓機能です。

SELECT * 
FROM (SELECT P.ProductID, Price AS SmallestOrderPrice, row_number() over (order by price asc) RN 
     FROM Products P) 
WHERE RN = 1 

それとも私の古い標準...(一般的に、あなたが2番目のテーブルからデータを必要とする場合、あなたは表示されませんすべてのプラットフォームで動作し、便利)

SELECT * 
FROM products P 
INNER JOIN (Select min(price) mp from products) P2 
on P.Price = P2.MP 

または存在するメソッドを使用して...(すべてのDBMS間で一般的に準拠しており、おそらく最速)

SELECT P.* 
    FROM products P 
    WHERE EXISTS (SELECT min(price) mp 
       FROM products P2 
       WHERE P2.Price = P.Price) 

私は持つがうまくいくかどうかわからないんだけど、それは

はずのように思えます
SELECT 
    P.ProductID, 
    MIN(Price) AS SmallestOrderPrice 
FROM Products P 
GROUP BY ProductID 
HAVING min(Price) = price 
+0

ありがとう、あなたのやり方の1つがそれをしました! – Mumfordwiz

0

すべての行の最小価格。

SELECT MIN(Price) 
    FROM Products 

そして、あなたがしたい場合は、以下も

SELECT 
p.ProductID 
, mp.MinPrice AS SmallestOrderPrice 
FROM 
    Products P 
    CROSS APPLY (SELECT MIN(Price) MinPrice FROM Products) AS mp 
WHERE 
    p.Price = mp.MinPrice 
2

ALL IDは、クエリがTOP 1ORDER BY Price ASC追加して、です。

ORDER BYを使用すると、現在のリターンがASCendingの順に並べられ、最も低い価格が一番上に表示されます。次に、TOP 1はその最小価格に制限されます。

SELECT TOP 1 
    P.ProductID, 
    MIN(Price) AS SmallestOrderPrice 
FROM Products P 
GROUP BY ProductID 
ORDER BY Price ASC; 

最低価格が同じ複数の商品がある場合、すべての商品が返されるわけではありません。その場合、おそらくxQbertのクエリが最適です。

関連する問題