2014-11-12 2 views
2

Я пытаюсь вернуть 2 лучших заказанных элемента в нашей базе данных клиентов. Ниже приведено то, что у меня есть для самого заказанного элемента, но у меня возникли проблемы с выяснением того, как создать другой столбец для второго наиболее упорядоченного элемента.SQL Query, чтобы вернуть верхние 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 
+0

Попробуйте использовать 2 CTE и сделайте выбор из каждого – JsonStatham

ответ

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 

Общий стол Выражение создает список всех клиентов, описания и их номер строки. Обратите внимание, что если у вас есть связи, вы не гарантированы, какое описание будет на первом месте. Вы можете добавить к описанию функции окна, чтобы, если есть связь, то, что на первом месте в алфавите, будет тай-брейкером.

+0

Daniel - что, если бы я также хотел добавить счет самого заказанного элемента? – marshpipes

+0

Вы можете просто добавить 'COUNT (*) [OrderCount]' в качестве другого столбца. –