Condividi tramite


Usare clausole HAVING e WHERE nella stessa query (Visual Database Tools)

si applica a:SQL Serverdatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsAnalytics 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 WHERE viene 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 clausola WHERE.

  • La clausola HAVING viene quindi applicata alle righe del set di risultati. Nell'output della query vengono visualizzati solo i gruppi che soddisfano le condizioni di HAVING. È possibile applicare una clausola HAVING solo alle colonne visualizzate anche nella clausola GROUP BY 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

  1. Specifica i gruppi per la query. Per informazioni dettagliate, vedere Raggruppare le righe nei risultati delle query (Visual Database Tools).

  2. Se non è già presente nel riquadro Criteri , aggiungere la colonna su cui si vuole basare la condizione WHERE.

  3. Cancellare la colonna Output a meno che la colonna di dati non faccia parte della clausola GROUP BY o sia inclusa in una funzione di aggregazione.

  4. Nella colonna Filtro specificare la condizione di WHERE. Il progettazione delle query e delle viste aggiunge la condizione alla clausola HAVING dell'istruzione SQL.

    Nota

    La query illustrata nell'esempio per questa procedura unisce due tabelle, titles e publishers.

    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'
    
  5. 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 HAVING nell'istruzione SQL e la aggiungono alla clausola WHERE.

    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;