Usar 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 algunos casos, es posible que desee excluir filas individuales de grupos (mediante una cláusula WHERE
) antes de aplicar una condición a grupos en su conjunto (mediante una cláusula HAVING
).
Una cláusula HAVING
es como una cláusula WHERE
, pero solo se aplica a grupos en su conjunto (es decir, a las filas del conjunto de resultados que representan grupos), mientras que la cláusula WHERE
se aplica a filas individuales. Una consulta puede contener una cláusula WHERE
y una cláusula HAVING
. En ese caso:
La cláusula
WHERE
se aplica primero a las filas individuales de las tablas o a los objetos con valores de tabla en el panel del diagrama . Solo se agrupan las filas que cumplen las condiciones de la cláusulaWHERE
.A continuación, la cláusula
HAVING
se aplica a las filas del conjunto de resultados. Solo los grupos que cumplen las condiciones deHAVING
aparecen en la salida de la consulta. Puede aplicar una cláusulaHAVING
solo 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 utilizada en este artículo es la base de datos pubs
, disponible en las bases de datos de ejemplo Northwind y pubs de para Microsoft SQL Server, que se encuentran en GitHub.
Por ejemplo, imagine que va a unir las tablas titles
y publishers
para crear una consulta que muestre el precio medio del libro de un conjunto de publicadores. Quiere ver el precio medio solo de un conjunto específico de editores, quizás solo los editores del estado de California. E incluso entonces, quiere ver el precio medio solo si es superior a los 10,00 USD.
Puede establecer la primera condición mediante la inclusión de una cláusula WHERE
, que descarta los publicadores que no están en California, antes de calcular los precios promedio. La segunda condición requiere una cláusula HAVING
, ya que la condición se basa en los resultados de la agrupación y resumen de los datos. La instrucción SQL resultante podría tener este aspecto:
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 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 forma parte de la cláusula HAVING
. Sin embargo, puede cambiar la condición para que sea una cláusula WHERE
.
Puede crear una cláusula WHERE
y una cláusula HAVING
que impliquen la misma columna. Para ello, debe agregar la columna dos veces al panel Criterios y, a continuación, especificar una instancia como parte de la cláusula HAVING
y la otra instancia como parte de la cláusula WHERE
.
Especificar una condición WHERE en una consulta agregada
Especifique los grupos de la consulta. Para obtener más información, consulte filas de grupos 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 de Salida a menos que la columna de datos forme parte de la cláusula GROUP BY o esté incluida en una función de agregación.
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
La consulta que se muestra en el ejemplo de este procedimiento combina 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 en la lista de opciones de grupo y resumen. El Diseñador de consultas y vistas quita la condición de la cláusula
HAVING
de la instrucción SQL y la agrega a la cláusulaWHERE
.La instrucción SQL cambia para incluir una cláusula
WHERE
en su lugar: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;