Esto es lo que yo hice y que no sé si está correcto:
Código
ALTER PROCEDURE SP_TopClientes AS CREATE TABLE #HistorialCantidad( --IdHistorial int primary key identity(0,1), Nombre VARCHAR(100), Año INT, Cantidad INT ) CREATE TABLE #Año( Id INT PRIMARY KEY IDENTITY(0,1), Año INT ) INSERT INTO #Año SELECT DISTINCT YEAR(OrderDate) FROM Orders DECLARE @Contador INT SET @Contador = 0 WHILE(@Contador < (SELECT COUNT(*) FROM #Año)) BEGIN INSERT INTO #HistorialCantidad SELECT DISTINCT TOP 5 c.CompanyName AS [Nombre Compañía], YEAR(o.OrderDate) AS Año, COUNT(*) AS Cantidad FROM [ORDER Details] od INNER JOIN Orders o ON o.OrderID = od.OrderID INNER JOIN Customers c ON c.CustomerID = o.CustomerID WHERE YEAR(o.OrderDate) = (SELECT Año FROM #Año WHERE Id = @Contador) GROUP BY c.CompanyName, YEAR(o.OrderDate) ORDER BY Cantidad DESC SET @Contador = @Contador+1 END SELECT * FROM #HistorialCantidad ORDER BY Año, Cantidad DROP TABLE #HistorialCantidad DROP TABLE #Año
Espero puedan ayudarme.