2013-03-05 64 views
8

我有一个SQL查询获取在给定商店的前5个销售商品。SQL Group BY,每个组的前N个项目

SELECT TOP 5 S.UPCCode, SUM(TotalDollarSales) FROM Sales S 
WHERE S.StoreId = 1 
GROUP BY S.UPCCode 
ORDER BY SUM(S.TotalDollarSales) desc 

销售表有 - > UPCCode,SaleDate,STOREID,TotalDollarSales

我要寻找一个查询将返回我的前5项为每个商店的出售在一个单一的查询。我可以编写多个查询并使用联合,但效率不高。

如何在单个查询中获得每个商店的前5个销售商品。

在此先感谢。

+0

可能重复的[TOP N问题GROUP BY子句](http://stackoverflow.com/questions/757763/top-n-problem-with-group逐条款) – 2013-03-05 15:55:06

回答

16
;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; 
7

尝试:

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