2013-03-05 19 views
8

Ho una query SQL che ottiene i primi 5 elementi venduti in un determinato negozio.SQL Group BY, primi N elementi per ciascun gruppo

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

La tabella Sales ha -> UPCCode, SaleDate, StoreID, TotalDollarSales

Sto cercando per una query che mi restituirà Top 5 articoli venduti per ciascuno dei negozi in una singola query. Posso scrivere più query e utilizzare un sindacato ma non sembra efficiente.

Come posso ottenere i primi 5 articoli venduti per ogni negozio in una singola query.

Grazie in anticipo.

+0

possibile duplicato del [problema TOP N con la clausola GROUP BY] (http://stackoverflow.com/questions/757763/top-n-problem-with-group -da-clause) –

risposta

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

provare questo:

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