Tengo el siguiente problema: Seleccionar a todos los clientes que hayan realizado más de 5 órdenes por año. Presentar el detalle de las cantidad por año. Ordenar por año.
Esto es lo que yo hice y que no sé si está correcto:
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.
Saludos,
- Yo lo estoy entendiendo así:
-- Seleccionar a todos los clientes que hayan realizado más de 5 órdenes por año.
-- Presentar el detalle de las cantidad por año. Ordenar por año
SELECT
CustomerID,
YEAR(OrderDate) AS Año,
COUNT(OrderID) AS Cantidad
FROM Orders
GROUP BY YEAR(OrderDate), CustomerID
HAVING COUNT(OrderID) > 5
ORDER BY Año
+------------+------+----------+
| CustomerID | Año | Cantidad |
+------------+------+----------+
| ERNSH | 1996 | 6 |
| QUICK | 1996 | 6 |
| RATTC | 1996 | 6 |
| AROUT | 1997 | 7 |
| BERGS | 1997 | 10 |
| BLONP | 1997 | 7 |
| BONAP | 1997 | 8 |
| BSBEV | 1997 | 6 |
| ERNSH | 1997 | 15 |
| FOLKO | 1997 | 7 |
| FRANK | 1997 | 8 |
| GOURL | 1997 | 7 |
| GREAL | 1997 | 6 |
| HILAA | 1997 | 10 |
| HUNGO | 1997 | 10 |
| KOENE | 1997 | 8 |
| LAMAI | 1997 | 8 |
| LEHMS | 1997 | 8 |
| MEREP | 1997 | 10 |
| OTTIK | 1997 | 6 |
| PICCO | 1997 | 6 |
| QUEEN | 1997 | 7 |
| QUICK | 1997 | 14 |
| RATTC | 1997 | 6 |
| REGGC | 1997 | 6 |
| SAVEA | 1997 | 17 |
| VAFFE | 1997 | 6 |
| WARTH | 1997 | 10 |
| WHITC | 1997 | 8 |
| BONAP | 1998 | 6 |
| BOTTM | 1998 | 8 |
| ERNSH | 1998 | 9 |
| FOLKO | 1998 | 9 |
| GODOS | 1998 | 7 |
| HANAR | 1998 | 7 |
| HILAA | 1998 | 6 |
| LINOD | 1998 | 7 |
| QUICK | 1998 | 8 |
| RATTC | 1998 | 6 |
| SAVEA | 1998 | 11 |
| SUPRD | 1998 | 6 |
+------------+------+----------+
Cita de: EdePC en 7 Abril 2019, 03:38 AM
Saludos,
- Yo lo estoy entendiendo así:
-- Seleccionar a todos los clientes que hayan realizado más de 5 órdenes por año.
-- Presentar el detalle de las cantidad por año. Ordenar por año
SELECT
CustomerID,
YEAR(OrderDate) AS Año,
COUNT(OrderID) AS Cantidad
FROM Orders
GROUP BY YEAR(OrderDate), CustomerID
HAVING COUNT(OrderID) > 5
ORDER BY Año
+------------+------+----------+
| CustomerID | Año | Cantidad |
+------------+------+----------+
| ERNSH | 1996 | 6 |
| QUICK | 1996 | 6 |
| RATTC | 1996 | 6 |
| AROUT | 1997 | 7 |
| BERGS | 1997 | 10 |
| BLONP | 1997 | 7 |
| BONAP | 1997 | 8 |
| BSBEV | 1997 | 6 |
| ERNSH | 1997 | 15 |
| FOLKO | 1997 | 7 |
| FRANK | 1997 | 8 |
| GOURL | 1997 | 7 |
| GREAL | 1997 | 6 |
| HILAA | 1997 | 10 |
| HUNGO | 1997 | 10 |
| KOENE | 1997 | 8 |
| LAMAI | 1997 | 8 |
| LEHMS | 1997 | 8 |
| MEREP | 1997 | 10 |
| OTTIK | 1997 | 6 |
| PICCO | 1997 | 6 |
| QUEEN | 1997 | 7 |
| QUICK | 1997 | 14 |
| RATTC | 1997 | 6 |
| REGGC | 1997 | 6 |
| SAVEA | 1997 | 17 |
| VAFFE | 1997 | 6 |
| WARTH | 1997 | 10 |
| WHITC | 1997 | 8 |
| BONAP | 1998 | 6 |
| BOTTM | 1998 | 8 |
| ERNSH | 1998 | 9 |
| FOLKO | 1998 | 9 |
| GODOS | 1998 | 7 |
| HANAR | 1998 | 7 |
| HILAA | 1998 | 6 |
| LINOD | 1998 | 7 |
| QUICK | 1998 | 8 |
| RATTC | 1998 | 6 |
| SAVEA | 1998 | 11 |
| SUPRD | 1998 | 6 |
+------------+------+----------+
Sí, está perfecto. Al final, creo que, lo terminaste simplificando. Muchas gracias por tu ayuda ;D