¿Cómo usar el Having en SQL Server con ejemplos?
Resumen: en este tutorial, aprenderás a usar la cláusula HAVING de SQL Server para filtrar los grupos según las condiciones especificadas.
Introducción a la cláusula HAVING de SQL Server
La cláusula HAVING se usa a menudo con la cláusula GROUP BY para filtrar grupos en una lista específica de condiciones. A continuación se ilustra la sintaxis de la cláusula HAVING:
--https://estradawebgroup.com
SELECT
select_list
FROM
table_name
GROUP BY
group_list
HAVING
conditions;
En la sintaxis anterior, la cláusula GROUP BY enlista las filas que se agruparan y la cláusula HAVING aplica una o más condiciones a cualquiera de estos grupos, siempre y cuando los especifiques en el HAVING. Solo los grupos que cumplen con las condiciones establecidas se evalúan como TRUE y se incluyen en el resultado de la consulta SELECT. En otras palabras, los grupos para los que la condición se evalúa como FALSE o UNKNOWN se filtran y no los regresara en la consulta.
Cláusula HAVING y GROUP BY
Dado que SQL Server procesa la cláusula HAVING después de la cláusula GROUP BY, no puedes hacer referencia a la función agregada especificada en la lista de selección mediante el alias de la columna. La siguiente consulta fallará:
SELECT
column_name1,
column_name2,
aggregate_function (column_name3) column_alias
FROM
table_name
GROUP BY
column_name1,
column_name2
HAVING.
column_alias > value;
--https://estradawebgroup.com
En su lugar, debes usar la expresión con la función agregada en la cláusula HAVING explícitamente, como se muestra a continuación:
SELECT
column_name1,
column_name2,
aggregate_function (column_name3) alias
FROM
table_name
GROUP BY
column_name1,
column_name2
HAVING
aggregate_function (column_name3) > value;
Ejemplos para filtrar registros con HAVING de SQL Server
Tomemos algunos ejemplos para entender cómo funciona la cláusula HAVING.
El primer ejemplo del uso de la cláusula HAVING que veremos es con la función COUNT de SQL Server.
Consulta la siguiente tabla de pedidos de la base de datos de muestra que aquí puedes descargar:
HAVING y COUNT
La siguiente declaración usa la cláusula HAVING y COUNT para encontrar todos los clientes que realizaron al menos dos pedidos al año:
SELECT
customer_id,
YEAR (order_date) fecha,
COUNT (order_id) order_count
FROM
sales.orders
GROUP BY
customer_id,
YEAR (order_date)
HAVING
COUNT (order_id) >= 2
ORDER BY
customer_id;
Resultado (primeros 10):
customer_id | fecha | order_count |
---|---|---|
1 | 2018 | 2 |
2 | 2017 | 2 |
3 | 2018 | 3 |
4 | 2017 | 2 |
5 | 2016 | 2 |
6 | 2018 | 2 |
7 | 2018 | 2 |
9 | 2018 | 2 |
10 | 2018 | 2 |
Analizando el ejemplo podemos ver lo siguiente:
- Primero, la cláusula GROUP BY agrupa la orden de venta por cliente y año de orden. La función COUNT() devuelve el número de pedidos que cada cliente realizó en cada año.
- En segundo lugar, la cláusula HAVING filtró todos los clientes cuyo número de pedidos es inferior a dos y regreso los que si cumplen con la condición.
Ejemplo del uso de la cláusula HAVING con la función SUM() de SQL Server.
En este ejemplo tomaremos en cuenta la tabla order_items de la misma base de datos de prueba:
La siguiente declaración encuentra las órdenes de venta cuyos valores netos son mayores a 20,000 usando la función SUM:
SELECT
order_id,
SUM (
quantity * list_price * (1 - discount)
) net_value
FROM
sales.order_items
GROUP BY
order_id
HAVING
SUM (
quantity * list_price * (1 - discount)
) > 20000
ORDER BY
net_value;
Resultado (primeros 10):
order_id | net_value |
---|---|
1 | 10231.0464 |
2 | 1697.9717 |
3 | 1519.981 |
4 | 1349.982 |
5 | 3900.0607 |
6 | 9442.5048 |
7 | 2165.0817 |
8 | 1372.4719 |
9 | 7199.982 |
10 | 242.991 |
Analizando el ejemplo podemos ver lo siguiente:
- Primero, la función SUM() devuelve los valores netos de las órdenes de venta.
- En segundo lugar, la cláusula HAVING filtra las órdenes de venta cuyos valores netos son menores o iguales a 20,000 y regresa las que cumplen con la condición.
Ejemplo del uso de la cláusula HAVING con la función MAX y MIN de SQL Server.
Ahora haremos un select a la siguiente tabla de productos de la misma base de datos de prueba:
La siguiente declaración usa las funciones MAX() y MIN() para encontrar primero los precios de lista máximos y mínimos en cada categoría de producto. Luego, filtra la categoría que tiene el precio de lista máximo superior a 4000 o el precio de lista mínimo inferior a 500:
SELECT
category_id,
MAX (list_price) max_list_price,
MIN (list_price) min_list_price
FROM
production.products
GROUP BY
category_id
HAVING
MAX (list_price) > 4000 OR MIN (list_price) < 500;
Resultado:
category_id | max_list_price | min_list_price |
---|---|---|
1 | 489.99 | 89.99 |
2 | 2599.99 | 416.99 |
3 | 2999.99 | 250.99 |
5 | 4999.99 | 1559.99 |
6 | 5299.99 | 379.99 |
7 | 11999.99 | 749.99 |
Ejemplo del uso de la cláusula HAVING con la función AVG() de SQL Server.
La siguiente declaración usa la función AVG() para encontrar las categorías de productos cuyos precios de lista promedio están entre 500 y 1,000:
SELECT
category_id,
AVG (list_price) avg_list_price
FROM
production.products
GROUP BY
category_id
HAVING
AVG (list_price) BETWEEN 500 AND 1000;
Resultado:
category_id | avg_list_price |
---|---|
2 | 682.123333 |
3 | 730.412307 |
En este tutorial, aprendiste a usar la cláusula HAVING de SQL Server para filtrar grupos de registros según las condiciones específicas que estableciste.