2011-10-14 46 views
0

我有一个SQL Server 2008数据库。这个数据库有一个名为Product,Order和OrderProduct的表。这三个表如下所示:SQL Server 2008数据库中类似记录的不同

Product 
------- 
ID 
Name 
Description 

Order 
----- 
ID 
OrderDate 
Status 

OrderProduct 
------------ 
OrderID 
ProductID 
Quantity 

我试图找出最后三个独特产品的人订购。不过,我还需要包含产品订购的最后日期。我的问题是我一直得到一个结果集是这样的:

豆类能(10/10/2011) 纯碱(10/09/2011) 豆类能(10/08/2011)

第二个“Can Beans”不应该在那里,因为我已经展示了“Can Beans”。我的查询是这样的:

SELECT TOP 3 DISTINCT 
    p.[Name], 
    o.[OrderDate] 
FROM 
    [Product] p, 
    [Order] o 
    [OrderProduct] l 
WHERE 
    l.[ProductID]=p.[ID] and 
    l.[OrderID]=o.[ID] 
ORDER BY 
    o.[OrderDate] DESC 

我知道DISTINCT不会工作的原因是因为订单日期不同。不过,我不知道如何解决这个问题。有人能告诉我如何解决这个问题吗?

回答

0

你试过GROUP BY吗?

SELECT TOP 3 
    p.[Name], 
    max(o.[OrderDate]) 
FROM 
    [Product] p, 
    [Order] o 
    [OrderProduct] l 
WHERE 
    l.[ProductID]=p.[ID] and 
    l.[OrderID]=o.[ID] 
GROUP BY p.[Name] 
ORDER BY 
    max(o.[OrderDate]) DESC 
2
WITH cteProducts AS (
    SELECT p.Name, o.OrderDate, 
      ROW_NUMBER() OVER(PARTITION BY p.Name ORDER BY o.OrderDate DESC) as RowNum 
     FROM Product p 
      INNER JOIN OrderProduct op 
       ON p.ID = op.ProductID 
      INNER JOIN Order o 
       ON op.OrderID = o.ID 
) 
SELECT TOP 3 Name, OrderDate 
    FROM cteProducts 
    WHERE RowNum = 1 
    ORDER BY OrderDate DESC; 
0

,尝试按这样的:

SELECT TOP 3 
    p.[Name], 
    MAX(o.[OrderDate]) 
FROM 
    [Product] p, 
    [Order] o 
    [OrderProduct] l 
WHERE 
    l.[ProductID]=p.[ID] and 
    l.[OrderID]=o.[ID] 
GROUP BY p.[Name] 
ORDER BY 
    MAX(o.[OrderDate]) DESC 
0

使用GROUP BY ......它是因为我已经使用SQL Server中的一段时间,但查询会是这个样子:

SELECT TOP 3 
    p.[Name], 
    max(o.[OrderDate]) AS MostRecentOrderDate 
FROM 
    [Product] p, 
    [Order] o 
    [OrderProduct] l 
WHERE 
    l.[ProductID]=p.[ID] and 
    l.[OrderID]=o.[ID] 
GROUP BY p.[Name] 
ORDER BY 
    MostRecentOrderDate DESC 

或者要显示他们第一次订购该产品,请选择min()而不是max()

相关问题