Reputation: 1838
I have a SQL Query which gets gets top 5 sold items at a given store.
SELECT TOP 5 S.UPCCode, SUM(TotalDollarSales) FROM Sales S
WHERE S.StoreId = 1
GROUP BY S.UPCCode
ORDER BY SUM(S.TotalDollarSales) desc
The Sales table has -> UPCCode, SaleDate, StoreId, TotalDollarSales
I am looking for a query which will return me Top 5 items sold for each of the stores in a single query. I can write multiple queries and use a union but it doesn't seem efficient.
How can I get the top 5 sold items for each store in a single query.
Thanks in advance.
Upvotes: 11
Views: 18128
Reputation: 7267
try this:
select ss.StoreId,is.*
from (select distinct StoreId from Sales) ss
cross apply (SELECT TOP 5 S.UPCCode, SUM(TotalDollarSales) as SumTotalDollarSales FROM Sales S
WHERE S.StoreId = ss.StoreId
GROUP BY S.UPCCode
ORDER BY SUM(S.TotalDollarSales) desc) is
Upvotes: 8
Reputation: 280252
;WITH s AS
(
SELECT StoreID, UPCCode, tds, rn = ROW_NUMBER()
OVER (PARTITION BY StoreID ORDER BY tds DESC)
FROM
(
SELECT StoreID, UPCCode, tds = SUM(TotalDollarSales)
FROM Sales
GROUP BY StoreID, UPCCode
) AS s2
)
SELECT StoreID, UPCCode, TotalDollarSales = tds
FROM s
WHERE rn <= 5
ORDER BY StoreID, TotalDollarSales DESC;
Upvotes: 24