2013-03-05 60 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