Condividi tramite


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

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 riquadro Diagramma. Vengono raggruppate solo le righe che soddisfano le condizioni nella clausola WHERE.

  • La clausola HAVING viene quindi applicata alle righe nel set di risultati. Nell'output della query vengono visualizzati solo i gruppi che soddisfano le condizioni HAVING. È possibile applicare una clausola HAVING solo alle colonne visualizzate anche nella clausola GROUP BY o in una funzione di aggregazione.

Immagina, ad esempio, di unire le tabelle titles e publishers per creare una query che mostri il prezzo medio dei libri per un insieme 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  

È 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 una clausola HAVING che coinvolgono la stessa colonna. A tale scopo, è necessario aggiungere la colonna due volte al riquadro Criteri, quindi specificare un'istanza come parte della clausola HAVING e l'altra come parte della clausola WHERE.

Per specificare una condizione WHERE in una query di aggregazione

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

  2. Se non è già presente nel riquadro Criteri, aggiungere la colonna in cui si desidera 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 WHERE. Il Progettazione Query e Vista aggiunge la condizione alla clausola HAVING dell'istruzione SQL.

    Annotazioni

    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 rimuove la condizione dalla clausola HAVING nell'istruzione SQL e la aggiunge alla clausola WHERE.

    L'istruzione SQL cambia in modo da 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  
    

Vedere anche

Ordinare e Raggruppare i Risultati delle Query (Strumenti di Database Visivi)
Riepilogare i risultati delle query (Visual Database Tools)