Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: S4ms3pi0l__ en 6 Abril 2019, 04:42 am



Título: Clientes que hayan realizado más de 5 órdenes por año [DB Northwind]
Publicado por: S4ms3pi0l__ en 6 Abril 2019, 04:42 am
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:

Código
  1. ALTER PROCEDURE SP_TopClientes
  2. AS
  3. CREATE TABLE #HistorialCantidad(
  4. --IdHistorial int primary key identity(0,1),
  5. Nombre VARCHAR(100),
  6. Año INT,
  7. Cantidad INT
  8. )
  9. CREATE TABLE #Año(
  10. Id INT PRIMARY KEY IDENTITY(0,1),
  11. Año INT
  12. )
  13. INSERT INTO #Año
  14. SELECT DISTINCT YEAR(OrderDate) FROM Orders
  15. DECLARE @Contador INT
  16. SET @Contador = 0
  17. WHILE(@Contador < (SELECT COUNT(*) FROM #Año))
  18. BEGIN
  19. INSERT INTO #HistorialCantidad
  20. SELECT DISTINCT TOP 5
  21. c.CompanyName AS [Nombre Compañía],
  22. YEAR(o.OrderDate) AS Año,
  23. COUNT(*) AS Cantidad
  24. FROM [ORDER Details] od
  25. INNER JOIN Orders o ON o.OrderID = od.OrderID
  26. INNER JOIN Customers c ON c.CustomerID = o.CustomerID
  27. WHERE YEAR(o.OrderDate) = (SELECT Año FROM #Año WHERE Id = @Contador)
  28. GROUP BY c.CompanyName, YEAR(o.OrderDate)
  29. ORDER BY Cantidad DESC
  30.  
  31. SET @Contador = @Contador+1
  32. END
  33. SELECT * FROM #HistorialCantidad ORDER BY Año, Cantidad
  34. DROP TABLE #HistorialCantidad
  35. DROP TABLE #Año
  36.  

Espero puedan ayudarme.


Título: Re: Clientes que hayan realizado más de 5 órdenes por año [DB Northwind]
Publicado por: 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

Código
  1. SELECT
  2.  CustomerID,
  3.  YEAR(OrderDate) AS Año,
  4.  COUNT(OrderID)  AS Cantidad
  5. FROM Orders
  6. GROUP BY YEAR(OrderDate), CustomerID
  7. HAVING COUNT(OrderID) > 5
  8. ORDER BY Año

Código:
+------------+------+----------+
| 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 |
+------------+------+----------+


Título: Re: Clientes que hayan realizado más de 5 órdenes por año [DB Northwind]
Publicado por: S4ms3pi0l__ en 7 Abril 2019, 22:41 pm
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

Código
  1. SELECT
  2.  CustomerID,
  3.  YEAR(OrderDate) AS Año,
  4.  COUNT(OrderID)  AS Cantidad
  5. FROM Orders
  6. GROUP BY YEAR(OrderDate), CustomerID
  7. HAVING COUNT(OrderID) > 5
  8. ORDER BY Año

Código:
+------------+------+----------+
| 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