Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
si applica a:SQL Server
database SQL di Azure
Istanza gestita di SQL di Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
In alcuni casi, è possibile escludere singole righe dai gruppi (usando una clausola WHERE) prima di applicare una condizione ai gruppi nel suo complesso (usando una clausola HAVING).
Una clausola HAVING è simile a una clausola WHERE, ma si applica solo ai gruppi nel suo complesso , ovvero alle righe del set di risultati che rappresentano i gruppi, mentre la clausola WHERE si applica alle singole righe. Una query può contenere sia una clausola WHERE che una clausola HAVING. In tal caso:
La clausola
WHEREviene applicata prima alle singole righe nelle tabelle o negli oggetti con valori di tabella nel diagramma . Vengono raggruppate solo le righe che soddisfano le condizioni nella clausolaWHERE.La clausola
HAVINGviene quindi applicata alle righe del set di risultati. Nell'output della query vengono visualizzati solo i gruppi che soddisfano le condizioni diHAVING. È possibile applicare unaHAVINGclausola solo alle colonne visualizzate anche nellaGROUP BYclausola o in una funzione di aggregazione.
Specificare una clausola WHERE e HAVING su due tabelle collegate
Nota
Il database usato in questo articolo è il database pubs, disponibile nei database di esempio Northwind e pubs per Microsoft SQL Server su GitHub.
Si supponga, ad esempio, di unire le tabelle titles e publishers per creare una query che mostra il prezzo medio del libro per un set di editori. Si vuole visualizzare il prezzo medio solo per un set specifico di editori , forse solo gli editori nello stato della California. E anche allora, si vuole vedere il prezzo medio solo se è superiore a $ 10,00.
È possibile stabilire la prima condizione includendo una clausola WHERE, che rimuove tutti gli editori che non si trovano in California, prima di calcolare i prezzi medi. La seconda condizione richiede una clausola HAVING, perché la condizione si basa sui risultati del raggruppamento e del riepilogo dei dati. L'istruzione SQL risultante potrebbe essere simile alla seguente:
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;
In Visual Database Tools di SQL Server Management Studio è possibile creare clausole HAVING e WHERE nel riquadro Criteri. Per impostazione predefinita, se si specifica una condizione di ricerca per una colonna, la condizione diventa parte della clausola HAVING. Tuttavia, è possibile modificare la condizione in modo che sia una clausola WHERE.
È possibile creare una clausola WHERE e HAVING che include la stessa colonna. A tale scopo, è necessario aggiungere la colonna due volte al riquadro Criteri, quindi specificare una volta come parte della clausola HAVING e l'altra volta come parte della clausola WHERE.
Specificare una condizione WHERE in una query di aggregazione
Specifica i gruppi per la query. Per informazioni dettagliate, vedere Raggruppare le righe nei risultati delle query (Visual Database Tools).
Se non è già presente nel riquadro Criteri , aggiungere la colonna su cui si vuole basare la condizione
WHERE.Cancellare la colonna Output a meno che la colonna di dati non faccia parte della
GROUP BYclausola o inclusa in una funzione di aggregazione.Nella colonna Filtro specificare la condizione di
WHERE. Il progettazione delle query e delle viste aggiunge la condizione alla clausolaHAVINGdell'istruzione SQL.Nota
La query illustrata nell'esempio per questa procedura unisce due tabelle,
titlesepublishers.A questo punto della query, l'istruzione SQL contiene una clausola
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';Nella colonna Group By selezionare Where nell'elenco di opzioni di gruppo e riepilogo. La Progettazione query e la Progettazione viste rimuovono la condizione dalla clausola
HAVINGnell'istruzione SQL e la aggiungono alla clausolaWHERE.L'istruzione SQL cambia per includere invece una clausola
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;