Utilizar cláusulas HAVING y WHERE en la misma consulta (Visual Database Tools)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
En algunas ocasiones, será conveniente excluir algunas filas de los grupos (utilizando una cláusula WHERE
) antes de aplicar una condición a los grupos como un todo (utilizando una cláusula HAVING
).
Una cláusula HAVING
es como una cláusula WHERE
, pero que solo se aplica a los grupos en su totalidad (es decir, a las filas del conjunto de resultados que representa los grupos), a diferencia de la cláusula WHERE
, que se aplica a filas individuales. Una consulta puede contener tanto una cláusula WHERE
como una cláusula HAVING
. En tal caso:
La cláusula
WHERE
se aplica primero a las filas individuales de las tablas u objetos con valores de tabla del panel Diagrama. Solo se agrupan las filas que cumplen las condiciones de la cláusulaWHERE
.La cláusula
HAVING
se aplica a continuación a las filas del conjunto de resultados. Solo aparecen en el resultado de la consulta los grupos que cumplen las condicionesHAVING
. Solo puede aplicar una cláusulaHAVING
a las columnas que también aparecen en la cláusula GROUP BY o en una función de agregado.
Especificar una cláusula WHERE y HAVING en dos tablas combinadas
Nota:
La base de datos usada en este artículo es la base de datos pubs
, disponible en bases de datos de ejemplo Northwind y pubs para Microsoft SQL Server en GitHub.
Imagine, por ejemplo, que va a combinar las tablas titles
y publishers
para crear una consulta que muestre el precio medio de los libros de un conjunto de editoriales. Solo quiere ver el precio medio de un conjunto específico de editores: los del estado de California, por ejemplo. Y además, solo quiere ver el precio medio si éste es superior a 10,00 USD.
Puede establecer la primera condición incluyendo una cláusula WHERE
, que descarta a todos los editores que no están en California, antes de calcular los precios medios. La segunda condición requiere una cláusula HAVING
, ya que se basa en los resultados de la agrupación y del resumen de los datos. La instrucción SQL resultante podría tener la forma siguiente:
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;
En Visual Database Tools de SQL Server Management Studio, puede crear ambas cláusulas HAVING
y WHERE
en el panel Criterios. De forma predeterminada, si especifica una condición de búsqueda para una columna, la condición entra a formar parte de la cláusula HAVING
. No obstante, puede cambiar la condición para que sea una cláusula WHERE
.
Puede crear una cláusula WHERE
y una cláusula HAVING
en las que intervenga la misma columna. Para ello, debe agregar la columna dos veces al panel Criterios y especificar, a continuación, una instancia como parte de la cláusula HAVING
y la otra como parte de la cláusula WHERE
.
Especificar una condición WHERE en una consulta de funciones agregadas
Especifique los grupos de la consulta. Para detalles, consulte Agrupar filas en los resultados de la consulta (Visual Database Tools).
Si aún no está en el panel Criterios, agregue la columna en la que desea basar la condición
WHERE
.Borre la columna Resultados , a menos que la columna de datos forme parte de la cláusula GROUP BY o esté incluida en una función de agregado.
En la columna Filtro, especifique la condición
WHERE
. El Diseñador de consultas y vistas agrega la condición a la cláusulaHAVING
de la instrucción SQL.Nota:
En la consulta mostrada en el ejemplo de este procedimiento se combinan dos tablas:
titles
ypublishers
.En este punto de la consulta, la instrucción SQL contiene una cláusula
HAVING
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA'
En la columna Agrupar por , seleccione Where de la lista de opciones de agrupación y resumen. El Diseñador de consultas y vistas quita la condición de la cláusula
HAVING
en la instrucción SQL y la agrega a la cláusulaWHERE
.La instrucción SQL cambia para incluir en su lugar una cláusula
WHERE
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id;