Computer finestre Internet

Raggruppamento di query SQL per. Raggruppamento di dati Transact-SQL GROUP BY. Raggruppamento utilizzando raggruppa per e filtraggio dei gruppi con avere

Il raggruppamento dei dati consente di dividere tutti i dati in insiemi logici, consentendo di eseguire calcoli statistici separatamente in ciascun gruppo.

1. Creazione di gruppi (GROUP BY)

I gruppi vengono creati utilizzando una proposta RAGGRUPPA PER operatore SELEZIONARE. Diamo un'occhiata a un esempio.

SELEZIONARE Prodotto, SUM(Quantità) AS Numero_prodotto FROM Sommaprodotto GRUPPO BY Prodotto

Con questa richiesta, abbiamo recuperato informazioni sul numero di prodotti venduti in ogni mese. Operatore SELEZIONARE comanda l'output di due colonne Prodotto- nome del prodotto e Numero_prodotto- un campo di calcolo che abbiamo creato per visualizzare la quantità di prodotti venduti (formula del campo SUM (Quantità)). Offerta RAGGRUPPA PER dice al DBMS di raggruppare i dati per colonna Prodotto. Vale anche la pena notare questo RAGGRUPPA PER dovrebbe venire dopo la frase DOVE e prima ORDINATO DA.

2. Filtra gruppi (HAVING)

Proprio come abbiamo filtrato le righe in una tabella, possiamo filtrare i dati raggruppati. A questo scopo in SQL c'è un operatore AVENDO. Prendiamo l'esempio precedente e aggiungiamo il filtraggio per gruppi.

SELEZIONARE Prodotto, SUM(Quantità) AS Product_num FROM Sommaprodotto GROUP BY Prodotto HAVING SUM(Quantità)>4000

Vediamo che dopo aver calcolato la quantità di merce venduta per ciascun prodotto, il DBMS “taglia” quei prodotti di cui sono state vendute meno di 4000 unità.

Come vediamo, l'operatore AVENDO molto simile all'operatore DOVE, tuttavia, hanno una differenza significativa tra loro: DOVE filtra i dati prima che vengano raggruppati e AVENDO- esegue il filtraggio dopo il raggruppamento. Quindi le righe rimosse dalla proposta DOVE NON sarà incluso nel gruppo. Gli operatori, quindi DOVE E AVENDO può essere utilizzato nella stessa frase. Diamo un'occhiata ad un esempio:

SELEZIONARE Prodotto, SUM(Quantità) AS Numero_prodotto FROM Sommaprodotto WHERE Prodotto<>"Sci Lunghi" GRUPPO PER Prodotto AVENTE SOMMA(Quantità)>4000

Abbiamo aggiunto l'operatore all'esempio precedente DOVE dove era indicato il prodotto Sci lunghi, che a sua volta ha influenzato il raggruppamento da parte dell'operatore AVENDO. Di conseguenza, vediamo che il prodotto Sci lunghi non è stato incluso nell'elenco dei gruppi con un numero di prodotti venduti superiore a 4000 pezzi.

3. Raggruppamento e ordinamento

Come con il normale recupero dei dati, possiamo ordinare i gruppi dopo averli raggruppati con l'operatore AVENDO. Per fare ciò possiamo utilizzare l'operatore che già conosciamo ORDINATO DA. In questa situazione, la sua applicazione è simile agli esempi precedenti. Per esempio:

SELEZIONARE Prodotto, SUM(Quantità) AS Product_num FROM Sommaprodotto GROUP BY Prodotto HAVING SUM(Quantità)>3000 ORDER BY SUM(Quantità)

oppure semplicemente indicare il numero del campo nell'ordine in cui vogliamo ordinarlo:

SELEZIONARE Prodotto, SUM(Quantità) AS Product_num FROM Sommaprodotto GROUP BY Prodotto HAVING SUM(Quantità)>3000 ORDER BY 2

Vediamo che per ordinare i risultati riassuntivi basta scrivere delle frasi con ORDINATO DA dopo l'operatore AVENDO. Tuttavia, c’è un avvertimento. Accedi al DBMS non supporta l'ordinamento dei gruppi per alias di colonna, ovvero nel nostro esempio per ordinare i valori non potremo scrivere alla fine della richiesta ORDINA PER Prodotto_num.

In questo articolo ti dirò come vengono raggruppati i dati, come utilizzare correttamente il raggruppamento e come avere query SQL interne utilizzando l'esempio di diverse query.

La maggior parte delle informazioni nei database sono archiviate in forma dettagliata. Tuttavia, spesso è necessario ottenere rapporti. Scopri ad esempio il numero totale di commenti degli utenti o magari la quantità di merce presente nei magazzini. Ci sono molti compiti simili. Pertanto, il linguaggio SQL prevede specificamente per questi casi i costrutti group by e have, che consentono, rispettivamente, di raggruppare e filtrare i gruppi di dati risultanti.

Tuttavia, il loro utilizzo causa molti problemi agli autori alle prime armi di creazioni di software. Non interpretano correttamente i risultati ottenuti e il meccanismo stesso di raggruppamento dei dati. Cerchiamo quindi di capire in pratica cosa succede e come.

Come parte dell'esempio, prenderò in considerazione solo una tabella. Il motivo è semplice: questi operatori sono già applicati al campione di dati risultante (dopo aver combinato le righe della tabella e averle filtrate). Quindi aggiungere gli operatori where e join non cambierà l'essenza.

Immaginiamo un esempio astratto. Supponiamo che tu abbia una tabella riepilogativa degli utenti del forum. Chiamiamolo userstat e assomiglia a questo. Un punto importante, crediamo che un utente possa appartenere a un solo gruppo.

nome_utente - nome utente

forum_group: nome del gruppo

mess_count: numero di messaggi

is_have_social_profile - se il profilo del forum contiene un collegamento a una pagina su un social network

Come puoi vedere, la tabella è semplice e puoi calcolare molte cose da solo utilizzando una calcolatrice. Tuttavia, questo è solo un esempio e ci sono solo 10 voci. Nei database reali, i record possono essere misurati in migliaia. Allora cominciamo con le domande.

Raggruppamento puro utilizzando Raggruppa per

Immaginiamo di dover conoscere il valore di ciascun gruppo, ovvero la valutazione media degli utenti del gruppo e il numero totale di messaggi lasciati nel forum.

Innanzitutto, una breve descrizione verbale per facilitare la comprensione della query SQL. Quindi, devi trovare i valori calcolati per gruppi di forum. Di conseguenza, tutte queste dieci righe devono essere divise in tre gruppi diversi: admin, moder, user. Per fare ciò, è necessario aggiungere un raggruppamento in base ai valori del campo forum_group alla fine della richiesta. E aggiungi anche espressioni calcolate da selezionare utilizzando le cosiddette funzioni aggregate.

Specifica i campi e le colonne calcolate seleziona forum_group, avg(raiting) come avg_raiting, sum(mess_count) come total_mess_count -- Specifica la tabella da userstat -- Specifica il raggruppamento per gruppo di campi per forum_group

Tieni presente che dopo aver utilizzato il costrutto group by in una query, puoi utilizzare solo i campi nella selezione specificati dopo il group by senza utilizzare le funzioni di aggregazione. I restanti campi devono essere specificati all'interno delle funzioni aggregate.

Ho anche usato due funzioni aggregate. AVG: calcola il valore medio. E SOMMA: calcola la somma.

gruppo_forumvalutazione_avgtotal_mess_count
amministratore 4 50
moderato 3 50
utente 3 150

1. Innanzitutto, tutte le righe della tabella di origine sono state divise in tre gruppi in base ai valori del campo forum_group. Ad esempio, c'erano tre utenti nel gruppo di amministratori. Ci sono anche 3 righe all'interno di moder. E all'interno del gruppo utenti c'erano 4 righe (quattro utenti).

2. Le funzioni aggregate sono state quindi applicate a ciascun gruppo. Ad esempio, per il gruppo di amministratori la valutazione media è stata calcolata come segue (2 + 5 + 5)/3 = 4. Il numero di messaggi è stato calcolato come (10 + 15 + 25) = 50.

Come puoi vedere, niente di complicato. Tuttavia, abbiamo applicato solo una condizione di raggruppamento e non abbiamo filtrato per gruppo. Passiamo quindi al prossimo esempio.

Raggruppamento utilizzando raggruppa per e filtraggio dei gruppi con avere

Consideriamo ora un esempio più complesso di raggruppamento di dati. Diciamo che dobbiamo valutare l’efficacia delle azioni per attirare gli utenti verso le attività social. Per dirla semplicemente, scopri quanti utenti nei gruppi hanno lasciato collegamenti ai loro profili e quanti messaggi di posta ignorati, ecc. Tuttavia, nella vita reale potrebbero esserci molti di questi gruppi, quindi dobbiamo filtrare quei gruppi che possono essere trascurati (ad esempio, troppo poche persone non hanno lasciato un collegamento; perché ingombrare il rapporto completo). Nel mio esempio, questi sono gruppi con un solo utente.

Per prima cosa descriveremo verbalmente cosa è necessario fare nella query SQL. Dobbiamo dividere tutte le righe della tabella userstat originale secondo i seguenti criteri: nome del gruppo e presenza di un profilo social. Di conseguenza, è necessario raggruppare i dati della tabella in base ai campi forum_group e is_have_social_profile. Tuttavia, non siamo interessati a quei gruppi in cui è presente una sola persona. Pertanto, tali gruppi devono essere filtrati.

Nota: Vale la pena sapere che questo problema potrebbe essere risolto raggruppando per un solo campo. Se usi il costrutto case. Tuttavia, nell'ambito di questo esempio, vengono mostrate le possibilità di raggruppamento.

Vorrei anche chiarire subito un punto importante. Puoi filtrare solo utilizzando avere quando utilizzi funzioni aggregate e non in base ai singoli campi. In altre parole, questo non è un costrutto where, è un filtro per gruppi di righe, non singoli record. Sebbene le condizioni all'interno siano specificate in modo simile utilizzando "o" e "e".

Questo è l'aspetto della query SQL

Specifica i campi e le colonne calcolate seleziona forum_group, is_have_social_profile, count(*) come totale -- Specifica la tabella da userstat -- Specifica il raggruppamento per campi group by forum_group, is_have_social_profile -- Specifica il filtro del gruppo con count(*) > 1

Tieni presente che i campi dopo il raggruppamento per costrutto sono separati da virgole. La specifica dei campi in select avviene allo stesso modo dell'esempio precedente. Ho utilizzato anche la funzione aggregata count, che calcola il numero di righe nei gruppi.

Ecco il risultato:

gruppo_forumis_have_social_profiletotale
amministratore 1 2
moderato 1 2
utente 0 3

Vediamo passo dopo passo come è arrivato questo risultato.

1. Inizialmente sono stati ottenuti 6 gruppi. Ciascuno dei gruppi forum_group è stato diviso in due sottogruppi in base ai valori del campo is_have_social_profile. In altre parole, gruppi: , , , , , .

Nota: A proposito, i gruppi non sarebbero necessariamente 6. Quindi, ad esempio, se tutti gli amministratori compilassero un profilo, allora ci sarebbero 5 gruppi, poiché il campo is_have_social_profile avrebbe un solo valore per gli utenti del gruppo admin.

2. Quindi a ciascun gruppo è stata applicata la condizione di filtro Avere. Sono stati pertanto esclusi i seguenti gruppi: , , . Poiché all'interno di ciascuno di questi gruppi c'era solo una riga della tabella di origine.

3. Successivamente sono stati calcolati i dati necessari ed è stato ottenuto il risultato.

Come puoi vedere, non c'è niente di difficile da usare.

Vale la pena sapere che, a seconda del database, le capacità di questi costrutti possono differire. Ad esempio, potrebbero essere presenti più funzioni aggregate oppure è possibile specificare colonne calcolate anziché singoli campi come raggruppamento. Queste informazioni devono già essere esaminate nelle specifiche.

Ora sai come raggruppare i dati con Raggruppa per e come filtrare i gruppi utilizzando hai.


Ultimo aggiornamento: 19/07/2017

T-SQL utilizza le istruzioni GROUP BY e HAVING per raggruppare i dati, utilizzando la seguente sintassi formale:

SELEZIONA colonne DALLA tabella

RAGGRUPPA PER

La clausola GROUP BY determina come verranno raggruppate le righe.

Ad esempio, raggruppiamo i prodotti per produttore

SELEZIONA Produttore, COUNT(*) AS Conteggio modelli DA Prodotti GRUPPO PER Produttore

La prima colonna nell'istruzione SELECT - Manufacturer rappresenta il nome del gruppo e la seconda colonna - ModelsCount rappresenta il risultato della funzione Count, che calcola il numero di righe nel gruppo.

Vale la pena considerare che qualsiasi colonna utilizzata in un'istruzione SELECT (senza contare le colonne che memorizzano il risultato di funzioni aggregate) deve essere specificata dopo la clausola GROUP BY. Quindi, ad esempio, nel caso precedente, la colonna Produttore è specificata in entrambe le clausole SELECT e GROUP BY.

E se l'istruzione SELECT seleziona una o più colonne e utilizza anche funzioni aggregate, è necessario utilizzare la clausola GROUP BY. Pertanto, il seguente esempio non funzionerà perché non contiene un'espressione di raggruppamento:

SELEZIONA produttore, COUNT(*) Modelli ASConta DA Prodotti

Un altro esempio, aggiungiamo un raggruppamento in base al numero di prodotti:

SELEZIONA Produttore, Conteggio prodotti, COUNT(*) AS Conteggio modelli DA Prodotti GRUPPO PER Produttore, Conteggio prodotti

La clausola GROUP BY può raggruppare su più colonne.

Se la colonna in cui stai raggruppando contiene un valore NULL, le righe con il valore NULL formeranno un gruppo separato.

Tieni presente che la clausola GROUP BY deve essere posta dopo la clausola WHERE ma prima della clausola ORDER BY:

SELEZIONA Produttore, COUNT(*) AS Conteggio modelli DA Prodotti DOVE Prezzo > 30000 GRUPPO PER Produttore ORDINA PER Conteggio modelli DESC

Filtraggio di gruppo. AVENDO

Operatore AVENDO determina quali gruppi verranno inclusi nel risultato di output, ovvero filtra i gruppi.

L'uso di HAVING è per molti versi simile all'uso di WHERE. Solo WHERE viene utilizzato per filtrare le righe, HAVING viene utilizzato per filtrare i gruppi.

Ad esempio, troviamo tutti i gruppi di prodotti per produttore per i quali è definito più di 1 modello:

SELEZIONA Produttore, COUNT(*) AS Conteggio modelli DA Prodotti GRUPPO PER Produttore HAVING COUNT(*) > 1

In questo caso, in un comando possiamo usare le espressioni WHERE e HAVING:

SELEZIONA Produttore, COUNT(*) AS Conteggio modelli DA Prodotti DOVE Prezzo * Conteggio prodotti > 80000 GRUPPO PER Produttore HAVING COUNT(*) > 1

Cioè, in questo caso, le righe vengono prima filtrate: vengono selezionati i prodotti il ​​cui costo totale è superiore a 80.000, quindi i prodotti selezionati vengono raggruppati per produttore. Quindi i gruppi stessi vengono filtrati: vengono selezionati quei gruppi che contengono più di 1 modello.

Se è necessario ordinare, l'espressione ORDER BY viene dopo l'espressione HAVING:

SELECT Produttore, COUNT(*) Modelli AS, SUM(ConteggioProdotti) Unità AS FROM Prodotti WHERE Prezzo * ConteggioProdotti > 80000 GRUPPO PER Produttore HAVING SUM(ConteggioProdotti) > 2 ORDER BY Unità DESC

In questo caso, il raggruppamento è per produttore e vengono selezionati anche il numero di modelli per ciascun produttore (Modelli) e il numero totale di tutti i prodotti per tutti questi modelli (Unità). Alla fine i gruppi vengono ordinati per numero di prodotti in ordine decrescente.

In questo tutorial imparerai come utilizzare l'istruzione SQL RAGGRUPPA PER con sintassi ed esempi.

Descrizione

La clausola SQL GROUP BY può essere utilizzata in un'istruzione SELECT per raccogliere dati su più record e raggruppare i risultati in una o più colonne.

Sintassi

La sintassi per l'istruzione GROUP BY in SQL è:

Parametri o argomenti

espressione1 , espressione2 , … espressione_n Espressioni che non sono incapsulate in una funzione aggregata e devono essere incluse in un GRUPPO BY alla fine della query SQL. aggregate_function Si tratta di una funzione aggregata come SUM, COUNT, MIN, MAX o AVG. aggregate_expression Questa è la colonna o l'espressione per la quale verrà utilizzata la funzione aggregate_. tabelle Le tabelle da cui si desidera recuperare i record. La clausola FROM deve specificare almeno una tabella. DOVE condizioni Facoltativo. Queste sono le condizioni che devono essere soddisfatte per selezionare i record. Espressione ORDER BY Facoltativo. L'espressione utilizzata per ordinare i record nel set di risultati. Se viene specificata più di un'espressione, i valori devono essere separati da virgole. ASC Facoltativo. ASC ordina il set di risultati in ordine crescente per espressione. Questo è il comportamento predefinito se non viene specificato alcun modificatore. DESC Opzionale. DESC ordina il set di risultati in ordine decrescente per espressione .

Esempio: utilizzo di GROUP BY con la funzione SUM

Vediamo come utilizzare GROUP BY con la funzione SUM in SQL.
In questo esempio, abbiamo una tabella dipendenti con i seguenti dati:

id_dip totale_stipendi
500 119500
501 113000

In questo esempio, abbiamo utilizzato la funzione SUM per sommare tutti gli stipendi per ciascun dept_id e abbiamo assegnato al risultato SUM(stipendio) un alias di "total_salaries". Poiché dept_id non è incapsulato nella funzione SUM, deve essere specificato nella clausola GROUP BY.

Esempio: utilizzo di GROUP BY con la funzione COUNT

Vediamo come utilizzare la clausola GROUP BY con la funzione COUNT in SQL.

In questo esempio, abbiamo una tabella prodotti con i seguenti dati:

In questo esempio, abbiamo utilizzato la funzione COUNT per calcolare il numero di total_products per ciascun Category_ID e abbiamo specificato l'alias "total_products" come risultato della funzione COUNT. Abbiamo escluso tutti i valori Category_id NULL filtrandoli nella clausola WHERE. Poiché Category_id non è incapsulato nella funzione COUNT, deve essere specificato nella clausola GROUP BY.

Esempio: utilizzo di GRUPPO BY con la funzione MIN

Vediamo ora come utilizzare la clausola GROUP BY con la funzione MIN in SQL.

In questo esempio utilizzeremo nuovamente la tabella dei dipendenti con i seguenti dati:

Verranno selezionate 2 voci. Ecco i risultati che otterrai:

id_dip salario_piùbasso
500 57500
501 42000

In questo esempio, abbiamo utilizzato la funzione MIN per restituire il valore dello stipendio più basso per ogni dept_id e abbiamo creato l'alias dei risultati della funzione MIN "lowest_salary". Poiché dept_id non è incapsulato nella funzione MIN, deve essere specificato nella clausola GROUP BY.

Esempio: utilizzo di GRUPPO BY con la funzione MAX

Infine, esaminiamo come utilizzare la clausola GROUP BY con la funzione MAX.

Usiamo di nuovo la tabella dei dipendenti, ma questa volta troviamo lo stipendio più alto per ciascun dept_id:

impiegato numero nome di battesimo cognome stipendio id_dip
1001 Giustino Bieber 62000 500
1002 Selena Gomez 57500 500
1003 Mila Kunis 71000 501
1004 Tom Crociera 42000 501

Immettere la seguente istruzione SQL.

Cognome

Anno di nascita

Ivanovic

Petrovich

Michailovich

Borisovich

Nikolaevna

Sidorova

Caterina

Ivanovna

Valentino

Sergeevich

Anatoly

Michailovich

Riso. 4.20. Utilizzando LIKE "^[D-M]%"

Ora puoi creare predicati in termini di relazioni SQL appositamente definite. Puoi cercare valori in un intervallo specifico (BETWEEN) o un set numerico (IN), oppure puoi cercare valori di caratteri che corrispondono al testo all'interno dei parametri (LIKE).

4.4. Funzioni GROUP BY e di aggregazione SQL

Il risultato di una query può essere un valore di gruppo generalizzato di campi, proprio come il valore di un singolo campo. Questo viene fatto utilizzando le funzioni di aggregazione SQL standard, elencate di seguito:

Ad eccezione del caso speciale COUNT(*), ciascuna di queste funzioni opera su una raccolta di valori in una colonna di una tabella e produce un solo valore.

L'argomento di tutte le funzioni tranne COUNT(*) può essere preceduto dalla parola chiave DISTINCT, a indicare che i valori della colonna duplicati

deve essere escluso prima che la funzione possa essere applicata. La funzione speciale COUNT(*) viene utilizzata per contare tutte le righe della tabella senza eccezioni (compresi i duplicati).

Le funzioni aggregate vengono utilizzate in modo simile ai nomi di campo in una clausola di query SELECT, con un'eccezione: accettano i nomi di campo come argomenti. Con SUM e AVG è possibile utilizzare solo campi numerici.

Sia i campi numerici che quelli di caratteri possono essere utilizzati con COUNT, MAX e MIN. Se utilizzati con campi carattere, MAX e MIN li tradurranno in un codice ASCII equivalente, che dovrebbe comunicare che MIN significherà il primo e MAX l'ultimo valore in ordine alfabetico.

Per trovare la SOMMA di tutti gli stipendi nella tabella DEPARTMENT_EMPLOYEE (Fig. 2.3), è necessario inserire la seguente query:

DA Dipartimento_ Dipendenti;

E sullo schermo vedremo il risultato: 46800 (la tabella avrà una colonna denominata SUM).

Anche calcolare il valore salariale medio è semplice:

SELEZIONA AVG ((Stipendio))

DA Dipartimento_ Dipendenti;

La funzione COUNT è leggermente diversa da tutte le altre. Conta il numero di valori in una determinata colonna o il numero di righe in una tabella. Quando conta i valori di una colonna, viene utilizzato con DISTINCT per contare il numero di valori univoci in un determinato campo.

La tabella ha otto righe contenenti diversi valori di stipendio.

Si noti che gli ultimi tre esempi tengono conto anche delle informazioni sui dipendenti licenziati.

La frase seguente consente di determinare il numero di divisioni per

DISTINCT seguito dal nome del campo a cui è applicato, racchiuso tra parentesi, con COUNT applicato alle singole colonne.

SELEZIONA CONTEGGIO (*)

DA Dipartimento_ Dipendenti;

La risposta sarà:

COUNT(*) conta ogni singola riga della tabella.

DISTINCT non è applicabile con COUNT (*).

Supponiamo che la tabella PAYMENT_STATE (Fig. 2.4) abbia un'altra colonna che memorizza l'importo delle detrazioni effettuate (campo Detrazione) per ciascuna riga dell'estratto conto. Se poi sei interessato all'intero importo, allora i contenuti delle colonne Importo e Detrazione dovranno essere sommati.

Se sei interessato all'importo massimo, tenendo conto delle detrazioni, contenuto nella dichiarazione, allora puoi farlo utilizzando la seguente frase:

SELEZIONA MAX (Somma + Detrazione)

DA Foglio_paga;

Per ogni riga nella tabella, questa query aggiungerà il valore del campo Importo al valore del campo Detrazione e selezionerà il valore più grande trovato.

GRUPPO PER CLAUSOLA (riorganizzazione, ordine)

La clausola GROUP BY consente di definire un sottoinsieme di valori in un particolare campo in termini di un altro campo e applicare una funzione aggregata al sottoinsieme. Ciò rende possibile combinare campi e funzioni aggregate in un'unica clausola SELECT.

Ad esempio, supponiamo di voler determinare quanti dipendenti ci sono in ciascun dipartimento (la risposta è mostrata nella Figura 4.21):

SELECT ID_dipartimento, COUNT (DISTINCT ID_dipartimento) AS Numero di_dipendenti

Dipartimento_ Dipendenti

Data del licenziamento

Numero di dipendenti

La clausola GROUP BY lascia solo valori di colonna univoci, ordinati in ordine crescente per impostazione predefinita. Sotto questo aspetto la clausola GROUP BY differisce dalla clausola ORDER BY in quanto quest'ultima, pur ordinando i record in ordine crescente, non rimuove i valori duplicati. Nell'esempio fornito, la query raggruppa le righe della tabella in base ai valori della colonna Dept_ID (per numero di dipartimento). Le righe con gli stessi numeri di reparto vengono prima combinate in gruppi, ma per ciascun gruppo viene visualizzata solo una riga. La seconda colonna mostra il numero di righe in ciascun gruppo, ad es. numero di dipendenti in ciascun reparto.

Il valore di un campo a cui viene applicato GROUP BY ha, per definizione, un solo valore per gruppo di output, proprio come fa una funzione aggregata. Il risultato è una compatibilità che consente di combinare aggregati e campi in questo modo.

Supponiamo, ad esempio, che la tabella PAYMENT_LIST assomigli a quella di Fig. 4.22 e si vuole determinare l'importo massimo corrisposto in busta paga a ciascun dipendente.

Tipo di pagamento

Di conseguenza otteniamo.

Riso. 4.23. Funzione aggregata con AS

Il raggruppamento può essere effettuato in base a diversi attributi:

DA Foglio1

GRUPPO PER ID_impiegato, Data;

Risultato:

Riso. 4.24. Raggruppamento per più attributi

Se è necessario limitare il numero di gruppi ottenuti dopo GROUP BY, è possibile implementarlo utilizzando la clausola HAVING.

4.5. Usando la frase AVERE

La clausola HAVING svolge per i gruppi lo stesso ruolo della clausola WHERE per le righe: viene utilizzata per escludere i gruppi, proprio come WHERE viene utilizzata per escludere le righe. Questa frase è inclusa nella frase

solo se è presente una clausola GROUP BY e l'espressione in HAVING deve assumere un singolo valore per il gruppo.

Ad esempio, supponiamo di dover mostrare la composizione quantitativa di tutti i dipartimenti (Fig. 2.3), escluso il dipartimento numero 3.

SELECT ID_dipartimento, COUNT (DISTINCT ID_dipartimento) AS Numero di _dipendenti

Dipartimento_ Dipendenti

Data del licenziamento

HAVING ID_Dipartimento< > 3;

Numero di dipendenti

L'ultimo elemento quando si valuta un'espressione di tabella è la sezione HAVING (se presente). La sintassi di questa sezione è la seguente:

::=

AVENDO

La condizione di ricerca di questa sezione specifica una condizione su un gruppo di righe in una tabella raggruppata. Formalmente la sezione HAVING può essere presente anche in un'espressione di tabella che non contiene GROUP BY. In questo caso, si presuppone che il risultato del calcolo delle partizioni precedenti sia una tabella raggruppata costituita da un unico gruppo senza colonne di raggruppamento dedicate.

La condizione di ricerca della clausola HAVING segue le stesse regole sintattiche della condizione di ricerca della clausola WHERE e può includere gli stessi predicati.

Tuttavia, esistono restrizioni sintattiche speciali relative all'uso nelle condizioni di ricerca delle specifiche delle colonne della tabella dalla clausola FROM di una determinata espressione di tabella. Queste restrizioni derivano dal fatto che la condizione di ricerca della sezione HAVING imposta la condizione per l'intero gruppo e non per le singole righe.

Pertanto, solo le specifiche delle colonne specificate come colonne di raggruppamento nella clausola GROUP BY possono essere utilizzate direttamente nelle espressioni aritmetiche dei predicati incluse nella clausola di selezione della clausola HAVING. Le restanti colonne possono essere specificate solo all'interno delle specifiche delle funzioni aggregate COUNT, SUM, AVG, MIN e MAX, che in questo caso calcolano un valore aggregato per l'intero gruppo di righe. La situazione è simile con le sottoquery incluse nei predicati della condizione di selezione della sezione HAVING: se la sottoquery utilizza una caratteristica del gruppo corrente, allora può essere specificata solo facendo riferimento alle colonne di raggruppamento.

Sia la query nel formato (per la tabella di base, vedere Fig. 4.22):

SELEZIONA ID_dipendente, Data, MAX ((Importo))

DA Foglio1

GRUPPO PER ID_impiegato, Data;

è necessario fare chiarezza affinché vengano visualizzati solo i pagamenti superiori a 1000.

Tuttavia, per standard è illegale utilizzare una funzione aggregata in una clausola WHERE (a meno che non si utilizzi una sottoquery, descritta più avanti), poiché i predicati vengono valutati in termini di una singola riga e le funzioni aggregate vengono valutate in termini di un gruppo di righe .

La seguente frase sarebbe errata:

SELEZIONA Id_id, Data, MAX (Importo)

DA Foglio1

DOVE MAX ((Somma)) > 1000 GRUPPO PER Comp_Id, Data;

La frase corretta sarebbe:

SELEZIONA ID_dipendente, Data, MAX ((Importo))