Utilizzo delle clausole HAVING e WHERE nella stessa query (Visual Database Tools)Use HAVING and WHERE Clauses in the Same Query (Visual Database Tools)

In alcuni casi può essere necessario escludere singole righe dai gruppi (utilizzando una clausola WHERE) prima di applicare una condizione ai gruppi (utilizzando una clausola 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).

La clausola HAVING è analoga alla clausola WHERE ma è applicabile solo ai gruppi come insieme, ossia alle righe nel set di risultati che rappresentano i gruppi, mentre la clausola WHERE è applicabile a righe singole.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 query può contenere sia una clausola WHERE che una clausola HAVING.A query can contain both a WHERE clause and a HAVING clause. In questo caso:In that case:

  • La clausola WHERE viene applicata prima alle singole righe nelle tabelle o negli oggetti con valori di tabella nel riquadro Diagramma.The WHERE clause is applied first to the individual rows in the tables or table-valued objects in the Diagram pane. Vengono raggruppate solo le righe che soddisfano le condizioni della clausola WHERE.Only the rows that meet the conditions in the WHERE clause are grouped.

  • Successivamente viene applicata la clausola HAVING alle righe del set di risultati.The HAVING clause is then applied to the rows in the result set. Nell'output della query saranno visualizzati solo i gruppi che soddisfano le condizioni HAVING.Only the groups that meet the HAVING conditions appear in the query output. La clausola HAVING può essere applicata solo alle colonne presenti anche nella clausola GROUP BY o in una funzione di aggregazione.You can apply a HAVING clause only to columns that also appear in the GROUP BY clause or in an aggregate function.

Si supponga ad esempio di unire le tabelle titles e publishers per creare una query in cui sia visualizzato il prezzo medio dei libri per un set di editori,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. limitando la ricerca a un set specifico di editori, ad esempio quelli dello stato della California,You want to see the average price for only a specific set of publishers — perhaps only the publishers in the state of California. e a un prezzo medio maggiore di 10 dollari.And even then, you want to see the average price only if it is over $10.00.

In questo caso, prima di calcolare il prezzo medio è possibile stabilire la prima condizione con una clausola WHERE che escluda tutti gli editori che non si trovano in California.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 seconda condizione richiede una clausola HAVING, in quanto la condizione è basata sui risultati del raggruppamento e del riepilogo di dati.The second condition requires a HAVING clause, because the condition is based on the results of grouping and summarizing the data. L'istruzione SQL risultante sarà analoga alla seguente: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  

È possibile creare sia clausole HAVING che clausole WHERE nel riquadro Criteri.You can create both HAVING and WHERE clauses in the Criteria pane. In base all'impostazione predefinita, se si specifica una condizione di ricerca per una colonna, tale condizione entrerà a far parte della clausola HAVING,By default, if you specify a search condition for a column, the condition becomes part of the HAVING clause. ma sarà comunque possibile cambiarla in una clausola.However, you can change the condition to be a WHERE clause.

È possibile creare una clausola WHERE e una clausola HAVING relative alla stessa colonna.You can create a WHERE clause and HAVING clause involving the same column. A tale scopo, è necessario aggiungere due volte la colonna nel riquadro Criteri, quindi assegnare un'istanza alla clausola HAVING e l'altra alla clausola 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.

Per specificare una condizione WHERE in una query di aggregazioneTo specify a WHERE condition in an aggregate query

  1. Specificare i gruppi per la query.Specify the groups for your query. Per informazioni dettagliate, vedere Raggruppare righe nei risultati di una query (Visual Database Tools).For details, see Group Rows in Query Results (Visual Database Tools).

  2. Se necessario, aggiungere nel riquadro Criteri la colonna su cui si desidera basare la condizione WHERE.If it is not already in the Criteria pane, add the column on which you want to base the WHERE condition.

  3. Se la colonna di dati non è inclusa nella clausola GROUP BY o nella funzione di aggregazione, eliminare il contenuto della colonna Output .Clear the Output column unless the data column is part of the GROUP BY clause or included in an aggregate function.

  4. Nella colonna Filtro specificare la condizione WHERE.In the Filter column, specify the WHERE condition. La condizione verrà aggiunta alla clausola HAVING dell'istruzione SQL.The Query and View Designer adds the condition to the HAVING clause of the SQL statement.

    Nota

    Nella query illustrata nell'esempio della procedura vengono unite due tabelle: titles e publishers.The query shown in the example for this procedure joins two tables, titles and publishers.

    A questo punto della creazione della query, l'istruzione SQL contiene una clausola 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. Selezionare Where dall'elenco di opzioni di raggruppamento e riepilogo nella colonna Group By .In the Group By column, select Where from the list of group and summary options. La condizione verrà rimossa dalla clausola HAVING dell'istruzione SQL e aggiunta alla clausola WHERE.The Query and View Designer removes the condition from the HAVING clause in the SQL statement and adds it to the WHERE clause.

    L'istruzione SQL includerà ora una clausola 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  
    

Vedere ancheSee Also

Ordinare e raggruppare i risultati delle query (Visual Database Tools)Sort and Group Query Results (Visual Database Tools)
Riepilogo dei risultati di query (Visual Database Tools)Summarize Query Results (Visual Database Tools)