Articles

SQLShack

Posted on

In questo articolo, impareremo la funzione SQL Average che è conosciuta come funzione AVG() in T-SQL. La funzione AVG() è una funzione aggregata che calcola il valore medio di un set di dati numerici che ritorna dall’istruzione SELECT.

Introduzione

Supponiamo di avere una collezione di numeri. In primo luogo, sommiamo tutti i membri della collezione e poi dividiamo il numero totale dei membri della collezione. Come risultato, il numero ottenuto sarà la media. Spieghiamo questa nozione matematica con un esempio semplice.

John è uno studente universitario e decide di registrare le sue spese ogni giorno. Il grafico e la tabella seguenti rappresentano le spese di John dell’ultima settimana.

Calcolo della media in matematica

Calcolo della media in matematica

Ora, calcoleremo la spesa media dell’ultima settimana di John. All’inizio, sommeremo tutte le spese per la suddetta settimana.

($20+$60+$20+$42+$10+$15+$8) = $175 è l’importo totale delle spese per la settimana.

Nel secondo passo, divideremo l’importo totale delle spese a 7 perché questa collezione è formata da 7 membri. In altre parole, una settimana consiste di sette giorni.

$175 / 7 = $25 è la spesa media della settimana.

Dopo aver discusso il concetto matematico della media, continuiamo ad imparare le basi della funzione AVG() in SQL.

Preparazione dei dati

Con l’aiuto della seguente query, creeremo la tabella WeekExpense e poi inseriremo le 3 settimane di spesa di John. Useremo questa tabella in tutti gli esempi di questo articolo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

CREATE TABLE WeekExpense
( WeekNumber VARCHAR(20),WeekDayName VARCHAR(50), Expense MONEY)
INSERT INTO WeekExpense
VALUES
(‘Week05′,’Lunedì’, 20 ),
(‘Week05′,’Martedì’, 60 ),
(‘Week05′,’Mercoledì’, 20 ),
( ‘Week05′,’Giovedì’, 42 ),
( ‘Week05′,’Venerdì’, 10 ),
( ‘Week05′,’Sabato’, 15 ) ,
(‘Week05′,’Domenica’, 8 ),
(‘Week04′,’Lunedì’, 29 ),
(‘Week04′,’Martedì’, 17 )
(‘Week04′,’Mercoledì’, 42 ),
(‘Week04′,’Giovedì’, 11 ),
(‘Week04′,’Venerdì’, 43 ),
(‘Week04′,’Sabato’, 10 ) ,
( ‘Week04′,’Domenica’, 15 ),
(‘Week03′,’Lunedì’, 10 ),
(‘Week03′,’Martedì’, 32 ),
(‘Week03′,’Mercoledì’, 35 ),
(‘Week03′,’Giovedì’, 19 ),
( ‘Week03′,’Venerdì’, 30 ),
( ‘Week03′,’Sabato’, 10 ) ,
( ‘Week03′,’Domenica’, 15 )
GO
SELECT *
FROM WeekExpense

Tabella WeekExpense resultset

Tabella delle spese settimanali resultset

SQL Sintassi della funzione Average

La sintassi della funzione AVG() sarà simile alla seguente nella sua forma semplice:

1
2
3

SELECT AVG ( columname )
FROM TABLENAME
WHERE CONDITION

La parola chiave ALL ci permette di calcolare una media per tutti i valori del set di risultati e viene utilizzata per default. La parola chiave DISTINCT implementa la funzione AVG() solo per i valori unici.

esempio della funzione AVG()

La seguente query calcolerà la spesa media di John con l’aiuto della funzione AVG().

1
2
3

SELECT AVG(Expense) AS
FROM WeekExpense
WHERE WeekNumber = ‘Week05’

Un semplice esempio della funzione AVG()

Un semplice esempio della funzione AVG()

L’immagine seguente illustra la metodologia di calcolo della funzione AVG() con un utilizzo predefinito.

Illustrazione della funzione SQL media

Illustrazione della funzione SQL media

Come possiamo vedere, AVG() considera tutti i valori dei giorni della settimana e dei fine settimana nel suo calcolo. Inoltre, possiamo ottenere lo stesso risultato quando aggiungiamo la parola chiave ALL alla sintassi.

1
2
3

SELECT AVG(ALL Expense) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

Un semplice esempio della funzione AVG() con parola chiave ALL

Un semplice esempio della funzione AVG() con la parola chiave ALL

Se vogliamo ignorare i valori duplicati durante il calcolo della funzione AVG(), possiamo usare la parola chiave DISTINCT. Dopo aver eseguito la query qui sotto, analizziamo il risultato:

1
2
3

SELECT AVG(DISTINCT Expense) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

Un semplice esempio della funzione AVG() con parola chiave DISTINCT

Un semplice esempio della funzione AVG() con la parola chiave DISTINCT

La parola chiave DISTINCT elimina i valori duplicati, quindi, prende in considerazione solo una delle spese i cui valori sono $20 nel calcolo. L’immagine seguente illustra fondamentalmente il meccanismo di funzionamento della parola chiave DISTINCT.

Illustrazione della funzione SQL media con parola chiave DISTINCT

Illustrazione della funzione SQL media con la parola chiave DISTINCT

Funzione media SQL e valori NULL

La funzione AVG() non considera i valori NULL durante il suo calcolo. Ora studieremo un esempio di questo problema. All’inizio, aggiorneremo le spese della domenica come NULL nella tabella WeekExpense.

1
2
3
4
5

UPDATE WeekExpense
SET
Expense = NULL
WHERE WeekDayName = ‘Domenica’ AND
WeekNumber = ‘Week05’

Ora, eseguiremo la seguente query per calcolare il valore medio.

1
2
3

SELECT AVG(Expense) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

AVG() esempio di funzione risultato

esempio di funzioneAVG() risultato

Come possiamo vedere, il valore NULL non è stato preso in considerazione dalla funzione AVG() nel calcolo. L’immagine seguente illustra il metodo di calcolo:

Illustrazione della funzione SQL media e interazione delle espressioni NULL

Illustrazione della funzione SQL media e interazione delle espressioni NULL

Se vogliamo includere i valori NULL nel calcolo, possiamo usare la funzione ISNULL. La funzione ISNULL è utilizzata per cambiare i valori NULL nei valori definiti. Quindi eseguiremo quanto segue per includere le espressioni NULL nel calcolo.

1
2
3

SELECT AVG(ISNULL(Spese,0)) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

Uso della funzione AVG() con ISNULL

Uso della funzione AVG() con ISNULL

L’immagine seguente illustra il metodo di calcolo della query precedente:

Come eliminare i valori NULL nella funzione SQL media

Come eliminare i valori NULL nella funzione SQL media

A questo punto, dobbiamo notare che abbiamo incluso l’espressione NULL al calcolo come 0.

Uso della funzione SQL Average con l’istruzione GROUP BY

L’istruzione GROUP BY è usata per raggruppare i dati e si usa principalmente con le funzioni aggregate.

John ha deciso di calcolare la spesa media di tutte le settimane. Per gestire il problema di John, abbiamo bisogno di usare l’istruzione GROUP BY e la funzione AVG() allo stesso tempo. La seguente query calcolerà la spesa media per ogni singola settimana.

1
2
3
4

SELECT WeekNumber, AVG(Expense) AS
FROM WeekExpense
GROUP BY WeekNumber
ORDER BY WeekNumber DESC

AVG() con la funzione GROUP BY

utilizzo della funzioneAVG() con la funzione GROUP BY

Quando abbiamo dato un’occhiata al set di risultati della query, possiamo vedere che le medie sono state calcolate per tutte le settimane separatamente.

Suggerimento bonus: Dettagli del piano di esecuzione della funzione SQL Average

Il piano di esecuzione aiuta a capire i dettagli di esecuzione di una query. Quando analizziamo il piano di esecuzione di una query, possiamo ovviamente capire cosa succede dietro le quinte.

Ora, analizzeremo il piano di esecuzione effettivo della seguente query con ApexSQL Plan in modo da poter capire chiaramente cosa succede dietro le quinte della funzione AVG().

1
2

SELECT AVG(Expense) AS
FROM WeekExpense

Il piano di esecuzione visivo della query è mostrato di seguito:

Piano di esecuzione della funzioneAVG()

La scansione della tabella legge tutte le righe nelle tabelle perché non creiamo alcun indice in questa tabella. Nel passo successivo, l’operatore di aggregazione Stream calcola la somma e il valore di conteggio delle espressioni.

Operatore di aggregazione Stream

Compute scalar prende queste espressioni da Stream aggregate e calcola il valore medio attraverso la seguente formula.

1
2
3
4
5

CASE
WHEN = (0)
THEN NULL
ELSE / CONVERT_IMPLICIT(money, , 0)
END

Computer operatore scalare

In questa formula, dovremmo notare un punto. Quando il numero totale delle espressioni restituisce 0, il calcolo della media restituisce NULL. Se il numero totale di espressioni restituisce 0, il valore medio sarà NULL. L’intenzione principale di questo è di evitare l’errore di divisione per zero.

Conclusione

In questo articolo, abbiamo imparato la funzione SQL Average e rafforzato il nostro apprendimento con esempi e illustrazioni di base. Lungo il percorso, abbiamo discusso i dettagli del piano di esecuzione della funzione AVG().

  • Autore
  • Post recenti
Esat Erkec
Esat Erkec è un professionista di SQL Server che ha iniziato la sua carriera più di 8 anni fa come sviluppatore di software. È un Microsoft Certified Solutions Expert di SQL Server.
La maggior parte della sua carriera si è concentrata sull’amministrazione e lo sviluppo di database SQL Server. I suoi interessi attuali sono nell’amministrazione di database e nella Business Intelligence. Potete trovarlo su LinkedIn.
Vedi tutti i post di Esat Erkec

Esat Erkec
Latest posts by Esat Erkec (see all)
  • Miti di ottimizzazione delle query – 23 marzo, 2021
  • Sintomi del Parameter Sniffing in SQL Server – 17 marzo 2021
  • Utilizzo della correzione automatica del piano per l’ottimizzazione delle query – 4 marzo 2021

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *