Compartir vía


Usar cláusulas HAVING y WHERE en la misma consulta (Visual Database Tools)

se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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áusula WHERE.

  • A continuación, la cláusula HAVING se aplica a las filas del conjunto de resultados. Solo los grupos que cumplen las condiciones de HAVING aparecen en la salida de la consulta. Puede aplicar una cláusula HAVING 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

  1. 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).

  2. Si aún no está en el panel Criterios, agregue la columna en la que desea basar la condición WHERE.

  3. 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.

  4. En la columna filtro , especifique la condición WHERE. El Diseñador de consultas y vistas agrega la condición a la cláusula HAVING de la instrucción SQL.

    Nota

    La consulta que se muestra en el ejemplo de este procedimiento combina dos tablas, titles y publishers.

    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'
    
  5. 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áusula WHERE.

    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;