La cláusula HAVING se agregó a SQL porque la palabra clave WHERE no se podía usar con funciones agregadas.
En ocasiones, cuando estamos creando una consulta, necesitamos poner una condición para seleccionar valores que utilizando alguna función de agregación, por ejemplo, queremos saber cuántos clientes tenemos en la empresa con más de tres pedidos. Para ello utilizamos HAVING ya que no podemos realizar funciones de agregación con la cláusula WHERE.
Sintaxis de HAVING en SQL
A continuación mostramos la sintaxis para realizar una consulta utilizando la cláusula HAVING.
SELECT nombre_columna(s) FROM nombre_tabla WHERE condicion GROUP BY nombre_columna(s) HAVING condicion ORDER BY nombre_columna(s);
Algunas de las funciones de agregación más utilizadas con HAVING son COUNT, SUM y MAX o MIN:
- COUNT: Para por ejemplo seleccionar clientes que han realizado más de 10 pedidos.
- MAX: Se utiliza mucho con HAVING, y es muy útil por ejemplo para seleccionar los clientes que han realizado su último pedido hace menos de una semana.
- SUM: Esta función de agregación se puede utilizar con HAVING para seleccionar los clientes cuya suma de importes de compra sea superior a 1000 euros por ejemplo.
Ejemplo de la utilización de HAVING en una consulta de SQL
La siguiente declaración SQL enumera la cantidad de clientes en cada país. Solo incluir países con más de 10 clientes:
SELECT COUNT(ClienteID), Pais FROM Clientes GROUP BY Pais HAVING COUNT(ClienteID)> 10;
La siguiente declaración SQL enumera la cantidad de clientes en cada país, ordenados de mayor a menor (solo incluye países con más de 15 clientes):
SELECT COUNT(ClienteID), Pais FROM Clientes GROUP BY Pais HAVING COUNT(ClienteID) > 15 ORDER BY COUNT(ClienteID) DESC;
HAVING COUNT: Ejemplo
La siguiente declaración SQL enumera los empleados que han registrado más de 40 pedidos:
SELECT Empleados.Apellidos, COUNT(Pedidos.PedidoID) AS Numero_Pedido FROM Pedidos INNER JOIN Empleados ON Pedidos.EmpleadoID = Empleados.EmpleadoID GROUP BY Apellidos HAVING COUNT(Pedidos.PedidoID) > 40;
HAVING SUM: Ejemplo
A continuación puedes ver como utilizar HAVING con la función agregada SUM para seleccionar los Clientes que tengan pedidos con un importe > 100
SELECT Clientes.Apellidos, SUM(Pedidos.ImportePedido) AS Importe FROM Pedidos INNER JOIN Clientes ON Pedidos.ClienteID = Clientes.ClientesID GROUP BY Apellidos HAVING SUM(Pedidos.ImportePedido) > 100;
HAVING MAX: Ejemplo
A continuación se muestra un ejemplo en el que solo seleccionamos los clientes cuyo importe de compra más alto sea > 1000
SELECT * FROM Clientes GROUP BY ClienteID HAVING MAX(ImporteCompra) > 1000