9th Dec 2022 Tempo di lettura: 4 minuti Come utilizzare le funzioni aggregate nella clausola WHERE Tihomir Babic sql where funzioni di aggregazione Filtrare i dati in base al risultato di una funzione aggregata è un'attività comune di analisi dei dati. Come si usano gli aggregati nella clausola DOVE nella clausola WHERE? Dedicheremo l'intero articolo a rispondere a questa domanda. La combinazione di funzioni aggregate e il filtraggio in base ai loro risultati sono spesso utilizzati nell'analisi dei dati, ad esempio per mostrare le filiali con vendite totali superiori a X, i paesi in cui il numero di post è inferiore a Y, gli studenti con un punteggio medio inferiore a Z e così via. I nuovi utenti di SQL spesso cercano di effettuare questo tipo di filtraggio nella clausola WHERE. Ma come vedremo in questo articolo, questa non è una soluzione praticabile. Vediamo quindi come ottenere i risultati desiderati. Prima, però, diamo un'occhiata al nostro set di dati. In questo caso, l'esempio si basa sui dati dello European Climate Assessment & Dataset. Esempio di dati Il nostro set di dati è costituito da una sola tabella: temperature_data. Essa contiene informazioni sulla temperatura massima giornaliera registrata in diverse città. Le colonne sono: id - L'ID della temperatura registrata. city - La città in cui è stata registrata la temperatura. date - La data di registrazione della temperatura. temperature - La temperatura più alta registrata (in gradi Celsius). Per essere più grafici, ecco tutti i dati della tabella. idcitydatetemperature 1Szczecin2022-05-3118.60 2Szczecin2022-05-3017.20 3Szczecin2022-05-2916.40 4Szczecin2022-05-2814.70 5Szczecin2022-05-2717.00 6Rotterdam2022-05-3118.40 7Rotterdam2022-05-3014.50 8Rotterdam2022-05-2914.50 9Rotterdam2022-05-2815.80 10Rotterdam2022-05-2716.10 11Berlin2022-05-3121.00 12Berlin2022-05-3017.50 13Berlin2022-05-2915.20 14Berlin2022-05-2816.30 15Berlin2022-05-2718.50 Una funzione aggregata nella clausola WHERE? Quello che voglio fare con questi dati è trovare la temperatura media più alta per città e mostrare solo le città con una media superiore a 16°C. I nuovi analisti potrebbero scrivere la query utilizzando la funzione aggregata AVG() nella clausola WHERE: SELECT city, AVG(temperature) AS average_max_temperature FROM temperature_data WHERE AVG(temperature) > 16 GROUP BY city; Per prima cosa, troviamo la temperatura media più alta per città. Poi usiamo questo risultato nella clausola WHERE; mi sembra corretto. Ma questa query lancia un errore! Questo errore risponde in modo molto esplicito alla domanda su come si usano le funzioni aggregate nella clausola WHERE: non si usano! Le funzioni aggregate non sono consentite perché la clausola WHERE è usata per filtrare i dati prima dell' aggregazione. Quindi, anche se WHERE non serve per l'aggregazione, ha altri usi. Per filtrare i dati in base ai risultati di una funzione aggregata, è necessario utilizzare la clausola HAVING ...la clausola. Utilizzare le funzioni aggregate nella clausola HAVING È semplice correggere la query precedente: basta sostituire WHERE con HAVING. La clausola HAVING viene utilizzata per filtrare i dati, proprio come WHERE. La differenza principale tra WHERE e HAVING è che la clausola HAVING HAVING filtra i dati dopo l' aggregazione. Quindi, quando si scrive il codice, bisogna assicurarsi che la clausola HAVING venga dopo la GROUP BY. Questo ha a che fare con l'ordine delle operazioni in SQL. Riscriviamo la nostra query precedente, eliminando WHERE e aggiungendo HAVING (dopo GROUP BY, ovviamente!): SELECT city, AVG(temperature) AS average_highest_daily_temperature FROM temperature_data GROUP BY city HAVING AVG(temperature) > 16; Ancora una volta, selezioniamo la città e troviamo la temperatura media usando la funzione AVG(). Ora, però, i dati sono raggruppati per città e filtrati utilizzando la clausola HAVING per mostrare solo le medie superiori a 16. cityaverage_highest_daily_temperature Szczecin16.78 Berlin17.70 Dai dati originali, rimangono le città di Stettino e Berlino perché la loro temperatura media giornaliera più elevata è superiore a 16°C. Funzioni aggregate e filtri vanno di pari passo, ma non nella clausola WHERE Sapere che non si possono usare le funzioni aggregate nella clausola WHERE è solo metà della risposta. Naturalmente, è necessario un modo per filtrare l'output delle funzioni aggregate. La clausola HAVING è quel modo! Entrambe le clausole sono abbastanza simili, soprattutto perché il modo in cui si imposta una condizione è lo stesso. Tuttavia, la cosa importante è sapere che le funzioni aggregate possono essere utilizzate in HAVING, ma non in WHERE. Affinché questa differenza vi venga naturale, dovrete scrivere molto codice. E per farlo, avrete bisogno di molti esempi, ed è proprio questo l'obiettivo del nostro corso. SQL Practice corso. Tags: sql where funzioni di aggregazione