SQL Server

HAVING en SQL Server explicado fácil: filtrar grupos con ejemplos reales y ejercicios

Publicado por J. Panduro hace 4 meses

HAVING en SQL Server explicado fácil: filtrar grupos con ejemplos reales y ejercicios

Cuando empiezas a trabajar con reportes y análisis de datos, llega un momento donde WHERE ya no es suficiente. Ahí entra HAVING, una cláusula fundamental en SQL Server.


HAVING se utiliza para filtrar resultados después de aplicar GROUP BY, permitiendo crear análisis empresariales reales como:


  1. Clientes que compraron más de cierto monto
  2. Categorías con muchas ventas
  3. Productos más vendidos


En este artículo aprenderás:


  1. Qué es HAVING
  2. Diferencia entre WHERE y HAVING
  3. Casos reales empresariales
  4. Ejercicios tipo entrevista
  5. Buenas prácticas


¿Qué es HAVING?


HAVING filtra grupos generados por GROUP BY.

Se usa normalmente junto con:

  1. COUNT()
  2. SUM()
  3. AVG()
  4. MAX()
  5. MIN()


Diferencia entre WHERE y HAVING



WHERE


Filtra antes del agrupamiento.


SELECT *
FROM Ventas
WHERE Total > 100;


Filtra ventas individuales.


HAVING


Filtra después del GROUP BY.


SELECT
Categoria,
SUM(Total) AS TotalVendido
FROM Ventas
GROUP BY Categoria
HAVING SUM(Total) > 1000;

Filtra categorías completa


Dataset completo (copiar y ejecutar)


-- 1. Limpiar tabla
IF OBJECT_ID('Ventas', 'U') IS NOT NULL
DROP TABLE Ventas;

-- 2. Crear tabla
CREATE TABLE Ventas (
IdVenta INT IDENTITY(1,1) PRIMARY KEY,
Producto VARCHAR(100) NOT NULL,
Categoria VARCHAR(50) NOT NULL,
Cliente VARCHAR(100) NOT NULL,
Total DECIMAL(10,2) NOT NULL,
FechaVenta DATE NOT NULL
);

-- 3. Insertar datos
INSERT INTO Ventas (Producto, Categoria, Cliente, Total, FechaVenta)
VALUES
('Laptop', 'Tecnología', 'Juan Pérez', 2500.00, '2026-01-10'),
('Mouse', 'Tecnología', 'Ana López', 80.00, '2026-01-11'),
('Teclado', 'Tecnología', 'Juan Pérez', 150.00, '2026-01-12'),
('Monitor', 'Tecnología', 'Carlos Ruiz', 900.00, '2026-01-13'),
('Silla', 'Muebles', 'Ana López', 450.00, '2026-01-14'),
('Escritorio', 'Muebles', 'Juan Pérez', 700.00, '2026-01-15'),
('Tablet', 'Tecnología', 'Carlos Ruiz', 1200.00, '2026-01-16');


Caso real: categorías con ventas mayores a 2000


SELECT
Categoria,
SUM(Total) AS TotalVendido
FROM Ventas
GROUP BY Categoria
HAVING SUM(Total) > 2000;



Clientes con más de una compra


SELECT
Cliente,
COUNT(*) AS CantidadCompras
FROM Ventas
GROUP BY Cliente
HAVING COUNT(*) > 1;


Clientes que gastaron más de 1000


SELECT
Cliente,
SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
HAVING SUM(Total) > 1000;


Productos con pocas ventas


SELECT
Producto,
COUNT(*) AS TotalVentas
FROM Ventas
GROUP BY Producto
HAVING COUNT(*) = 1;

Detecta productos con baja rotación.


WHERE + HAVING juntos


Puedes usar ambos.


SELECT
Categoria,
SUM(Total) AS TotalVendido
FROM Ventas
WHERE Total > 100
GROUP BY Categoria
HAVING SUM(Total) > 1000;


¿Qué pasa aquí?


WHERE

Primero elimina ventas menores o iguales a 100.


GROUP BY

Luego agrupa por categoría.


HAVING

Finalmente filtra grupos mayores a 1000.


EJERCICIOS


Nivel entrevista real


Obtener:

  1. Categoría
  2. Cantidad de ventas
  3. Total vendido
  4. Solo categorías con total mayor a 3000


SOLUCIÓN

SELECT
Categoria,
COUNT(*) AS CantidadVentas,
SUM(Total) AS TotalVendido
FROM Ventas
GROUP BY Categoria
HAVING SUM(Total) > 3000;


Ejercicio tipo empresa


Obtener:

  1. Clientes con más de una compra
  2. Total gastado
  3. Ordenados del mayor al menor


SELECT
Cliente,
COUNT(*) AS CantidadCompras,
SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
HAVING COUNT(*) > 1
ORDER BY TotalGastado DESC;



Sobre el autor

J. Panduro es desarrollador de software y creador de HPanduDigital. Comparte contenido sobre Desarrollo Web, inteligencia artificial, y transformación digital, basado en experiencias reales y proyectos prácticos.

Buscar artículos

Escribe al menos 2 caracteres para buscar.