Utilizar cláusulas HAVING y WHERE en la misma consulta (Visual Database Tools)Use HAVING and WHERE Clauses in the Same Query (Visual Database Tools)

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).In some instances, you might want to exclude individual rows from groups (using a WHERE clause) before applying a condition to groups as a whole (using a HAVING clause).

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.A HAVING clause is like a WHERE clause, but applies only to groups as a whole (that is, to the rows in the result set representing groups), whereas the WHERE clause applies to individual rows. Una consulta puede contener tanto una cláusula WHERE como una cláusula HAVING.A query can contain both a WHERE clause and a HAVING clause. En tal caso:In that case:

  • La cláusula WHERE se aplica primero a las filas individuales de las tablas u objetos con valores de tabla del panel Diagrama.The WHERE clause is applied first to the individual rows in the tables or table-valued objects in the Diagram pane. Solo se agrupan las filas que cumplen las condiciones de la cláusula WHERE.Only the rows that meet the conditions in the WHERE clause are grouped.

  • La cláusula HAVING se aplica a continuación a las filas del conjunto de resultados.The HAVING clause is then applied to the rows in the result set. Solo aparecen en el resultado de la consulta los grupos que cumplen las condiciones HAVING.Only the groups that meet the HAVING conditions appear in the query output. Solo puede aplicar una cláusula HAVING a las columnas que también aparecen en la cláusula GROUP BY o en una función de agregado.You can apply a HAVING clause only to columns that also appear in the GROUP BY clause or in an aggregate function.

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.For example, imagine that you are joining the titles and publishers tables to create a query showing the average book price for a set of publishers. Solo desea ver el precio medio de un conjunto específico de editoriales: las del estado de California, por ejemplo.You want to see the average price for only a specific set of publishers — perhaps only the publishers in the state of California. Y además, solo quiere ver el precio medio si éste es superior a 10,00 USD.And even then, you want to see the average price only if it is over $10.00.

Puede establecer la primera condición incluyendo una cláusula WHERE, que descarta todas las editoriales que no están en California, antes de calcular los precios medios.You can establish the first condition by including a WHERE clause, which discards any publishers that are not in California, before calculating average prices. 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.The second condition requires a HAVING clause, because the condition is based on the results of grouping and summarizing the data. La instrucción SQL resultante podría tener la forma siguiente:The resulting SQL statement might look like this:

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  

Puede crear tanto cláusulas HAVING como WHERE en el panel Criterios.You can create both HAVING and WHERE clauses in the Criteria pane. 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.By default, if you specify a search condition for a column, the condition becomes part of the HAVING clause. No obstante, puede cambiar la condición para que sea una cláusula WHERE.However, you can change the condition to be a WHERE clause.

Puede crear una cláusula WHERE y una cláusula HAVING en las que intervenga la misma columna.You can create a WHERE clause and HAVING clause involving the same column. 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.To do so, you must add the column twice to the Criteria pane, then specify one instance as part of the HAVING clause and the other instance as part of the WHERE clause.

Para especificar una condición WHERE en una consulta de funciones agregadasTo specify a WHERE condition in an aggregate query

  1. Especifique los grupos de la consulta.Specify the groups for your query. Para detalles, consulte Agrupar filas en los resultados de la consulta (Visual Database Tools).For details, see Group Rows in Query Results (Visual Database Tools).

  2. Si aún no está en el panel Criterios, agregue la columna en la que desea que se base la condición WHERE.If it is not already in the Criteria pane, add the column on which you want to base the WHERE condition.

  3. 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.Clear the Output column unless the data column is part of the GROUP BY clause or included in an aggregate function.

  4. En la columna Filtro , especifique la condición WHERE.In the Filter column, specify the WHERE condition. El Diseñador de consultas y vistas agrega la condición a la cláusula HAVING de la instrucción SQL.The Query and View Designer adds the condition to the HAVING clause of the SQL statement.

    Nota

    En la consulta mostrada en el ejemplo de este procedimiento se combinan dos tablas: titles y publishers.The query shown in the example for this procedure joins two tables, titles and publishers.

    En este punto de la consulta, la instrucción SQL contiene una cláusula HAVING:At this point in the query, the SQL statement contains a HAVING clause:

    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'  
    
  5. En la columna Agrupar por , seleccione Where de la lista de opciones de agrupación y resumen.In the Group By column, select Where from the list of group and summary options. 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áusula WHERE.The Query and View Designer removes the condition from the HAVING clause in the SQL statement and adds it to the WHERE clause.

    La instrucción SQL cambia para incluir en su lugar una cláusula WHERE:The SQL statement changes to include a WHERE clause instead:

    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  
    

Vea tambiénSee Also

Ordenar y agrupar los resultados de una consulta (Visual Database Tools)Sort and Group Query Results (Visual Database Tools)
Resumir los resultados de una consulta (Visual Database Tools)Summarize Query Results (Visual Database Tools)