2016-01-22 34 views
1

如何選擇適當的記錄時,以選擇適當的記錄/從一組記錄的記錄使用任一MAX或MIN集合函數時,使得記錄/記錄是否與聚合函數返回的值相匹配?如何/從一組記錄的記錄使用任一MAX或MIN集合函數

我需要,以便找到在每個類別中最昂貴的產品使用NorthWind.products數據庫表(http://www.zentut.com/wp-content/uploads/downloads/2013/06/Northwind-Sample-Database-Diagram.pdf)。到目前爲止,我已經試過兩個變種:

SELECT CategoryID, ProductID, ProductName, MAX(UnitPrice) MostExpensive 
FROM [NORTHWND].[dbo].[Products] as A 
GROUP BY CategoryID; 

此代碼將產生錯誤「列NORTHWND.dbo.Products.ProductID'在選擇列表中無效,因爲它不是在聚合函數或GROUP包含BY條款「。我完全明白了原因。沒關係。

第二個變量是:

SELECT CategoryID, ProductID, ProductName 
FROM [NORTHWND].[dbo].[Products] as A 
WHERE UnitPrice = (
        SELECT MAX(UnitPrice) FROM [NORTHWND].[dbo].[Products] AS B GROUP BY CategoryID HAVING A.CategoryID = B.CategoryID 
        ) 

這一個工作正常,返回的記錄是正確的,但我想在第一個SELECT 4列,第四應該是最高價格每個類別。我可以更改SQL查詢來實現這一目標,或者我應該嘗試第三方案?

回答

2

SQL Server >= 2005

SELECT * 
FROM (
    SELECT CategoryID, 
      ProductID, 
      ProductName, 
      UnitPrice, 
      RowNum = ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY UnitPrice DESC) 
    FROM dbo.Products 
) t 
WHERE t.RowNum = 1 

SQL Server < 2005

SELECT DISTINCT 
     p.CategoryID, 
     p.ProductID, 
     p.ProductName, 
     p.UnitPrice 
FROM dbo.Products p 
JOIN (
    SELECT CategoryID, UnitPrice = MAX(UnitPrice) 
    FROM dbo.Products 
    GROUP BY CategoryID 
) t ON t.UnitPrice = p.UnitPrice AND t.CategoryID = p.CategoryID 
相關問題