2

我正在尝试返回我们客户数据库中订购最多的 2 个商品。以下是我订购最多的商品的内容,但我无法弄清楚如何为第二次订购最多的商品创建另一列。

创建第二列的最佳方法是什么?

SELECT FirstName, EmailAddress, Id, PreferredLocationId, 
(
     SELECT TOP 1 [Description] FROM [Order] o 
     INNER JOIN [OrderItem] oi ON oi.OrderId = o.OrderId
     WHERE o.CustomerId = Customer.Id
     GROUP BY [Description]
     ORDER BY COUNT(*) DESC
) AS MostOrderedItem
FROM Customer
GROUP BY FirstName, EmailAddress, Id, PreferredLocationId
4

1 回答 1

3

如果您使用的是 SQL Server 2012,有很多不同的方法来处理这个问题。我将使用 CTE 来获取前两行并使用ROW_NUMBER()

WITH cte AS (
  SELECT CustomerId, [Description]
    , ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY COUNT(*) DESC) [RowID]
  FROM [Order] o 
  INNER JOIN [OrderItem] oi ON oi.OrderId = o.OrderId
  GROUP BY CustomerId, [Description]
)
SELECT FirstName, EmailAddress, Id, PreferredLocationId, cte1.Description, cte2.Description
FROM Customer
LEFT JOIN cte cte1 ON cte1.CustomerID = Customer.CustomerId AND cte1.RowID = 1
LEFT JOIN cte cte2 ON cte2.CustomerID = Customer.CustomerId AND cte2.RowID = 2

公用表表达式创建所有客户、描述及其行号的列表。请注意,如果您有联系,则不能保证哪个描述会先出现。您可以添加到窗口函数描述中,这样如果出现平局,字母表中的第一个将成为平局破坏者。

于 2014-11-12T17:28:27.783 回答