A diferencia de la cláusula WHERE,
HAVING se puede utilizar con funciones agregadas. Una función agregada es una
función donde se agrupan los valores de varias filas juntos como información
sobre ciertos criterios para formar un valor único de significado más
significativo o medición.
Las funciones agregadas comunes incluyen COUNT(), SUM(), MIN() y MAX().
Este ejemplo utiliza la tabla Coches
de una base de datos de ejemplo.
SELECT IdCliente, COUNT(Id) AS [Numero de Coches] FROM Coches
GROUP BY IdCliente HAVING COUNT(Id) > 1
Esta consulta devolverá el ID de cliente y el número de coches de cualquier
cliente que tenga más de uno. En este caso, hay dos clientes que tienen
más de uno, el 1 y el 4, el cliente 1 tiene 2 coches y el cliente 4 tiene 3 coches.
Los resultados se verán así:
Id. de cliente Número de Coches
stomerId ProductId Quantity Price
1 2
4 3
También se puede utilizar HAVING para comprobar si hay clientes que hayan pedido dos productos determinados. Por ejemplo en este caso se quiere saber los clientes que han pedido el producto con Id = 2 e Id = 3.
SELECT IdCliente FROM Pedidos WHERE IdProducto in (2,3)
GROUP by IdCliente HAVING count(distinct IdProducto) = 2
La consulta selecciona solo registros con los IdProducto 2 y 3 y con la cláusula
HAVING busca solo los clientes que hayan pedido ambos IdProducto
y no solo uno.
Otra posibilidad sería
SELECT IdCliente FROM orders GROUP BY IdCliente HAVING SUM(CASE WHEN IdProducto = 2 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN productID = 3 THEN 1 ELSE 0 END) > 0
Esta consulta selecciona solo grupos que tengan al menos un registro con
IdProducto = 2 y al menos uno con IdProducto = 3.