Data Analyst

GROUP BY e HAVING: creazione di KPI in SQL

Trasforma le linee di vendita in indicatori affidabili per città, categoria o periodo.

Team SQL.tn10min
Illustrazione di linee dati raggruppate e poi trasformate in indicatori visivi

Passare dal dettaglio all'indicatore

Una tabella degli ordini contiene in genere una riga per transaction. Una dashboard prevede invece una riga per città, per categoria o per mese, accompagnata da indicatori come fatturato e paniere medio.

GROUP BY modifica il livello di dettaglio del risultato. Tutte le righe che condividono lo stesso valore vengono raggruppate prima di calcolare le funzioni di aggregazione.

I dati contenuti in questo articolo sono fittizi. Gli importi e i risultati vengono utilizzati solo per spiegare il metodo.

COUNT, SUM e AVG rispondono a tre domande diverse

COUNT conta, SUM aggiunge e AVG calcola una media. Queste funzioni comprimono più righe in un valore sintetico.

In un report sulle vendite puoi contare gli ordini, sommarne l'importo e calcolare il valore medio degli ordini nella stessa query.

  • COUNT(*) conta le righe nel gruppo.
  • COUNT(colonne) ignora i valori NULL in questa colonna.
  • SUM(montant) aggiunge gli importi diversi da NULL.
  • AVG(montant) calcola la loro media.
Indicatori globali sugli ordini
SELECT
  COUNT(*) AS nombre_commandes,
  SUM(montant) AS chiffre_affaires,
  ROUND(AVG(montant), 2) AS panier_moyen
FROM commandes;

GROUP BY crea una riga per gruppo

Per ottenere una riga per città, aggiungi ville al risultato e la clausola GROUP BY. Ogni aggregazione viene poi calcolata separatamente per Tunisi, Sfax e le altre città presenti.

Come regola pratica, qualsiasi colonna visualizzata in SELECT che non è aggregata dovrebbe apparire in GROUP BY.

Numero di clienti per città
SELECT
  ville,
  COUNT(*) AS nombre_clients
FROM clients
GROUP BY ville
ORDER BY nombre_clients DESC;

WHERE filtra le righe prima del calcolo

WHERE rimuove le righe prima di formare gruppi. Per creare i KPI per l'anno 2026, filtra gli ordini in base alla data prima di eseguire GROUP BY.

Questa distinzione è importante: le linee escluse da WHERE non partecipano al conteggio, né alla somma, né alla media.

Fatturato 2026 per cliente
SELECT
  id_client,
  SUM(montant) AS chiffre_affaires
FROM commandes
WHERE date_commande >= DATE '2026-01-01'
  AND date_commande < DATE '2027-01-01'
GROUP BY id_client;

HAVING filtra i gruppi dopo il calcolo

HAVING si verifica dopo l'aggregazione. Permette ad esempio di mantenere solo le città con almeno cinque ordini o un fatturato superiore ad una soglia.

Utilizzare WHERE per una condizione su una riga originale e HAVING per una condizione su un gruppo o un'aggregazione.

Fidelizza i clienti con almeno cinque ordini
SELECT
  id_client,
  COUNT(*) AS nombre_commandes
FROM commandes
GROUP BY id_client
HAVING COUNT(*) >= 5
ORDER BY nombre_commandes DESC;

Assemblare una query KPI completa

Per analizzare le vendite per città, è necessario prima collegare gli ordini ai clienti, filtrare il periodo, raggruppare per città quindi filtrare i gruppi non rappresentativi.

L'alias chiffre_affaires può essere riutilizzato in ORDER BY con il simulatore del sito. La clausola HAVING mantiene l'espressione di aggregazione completa per rimanere esplicita.

KPI di vendita per città
SELECT
  c.ville,
  COUNT(co.id_commande) AS nombre_commandes,
  SUM(co.montant) AS chiffre_affaires,
  ROUND(AVG(co.montant), 2) AS panier_moyen
FROM clients AS c
INNER JOIN commandes AS co
  ON c.id_client = co.id_client
WHERE co.date_commande >= DATE '2026-01-01'
  AND co.date_commande < DATE '2027-01-01'
GROUP BY c.ville
HAVING COUNT(co.id_commande) >= 5
ORDER BY chiffre_affaires DESC;

Errori che distorcono un KPI

La corretta aggregazione dipende tanto dal livello di dettaglio quanto dalla formula. Prima di pubblicare un indicatore, controlla cosa rappresenta esattamente ciascuna riga del risultato.

  • Mostra una colonna non aggregata senza aggiungerla a GROUP BY.
  • Utilizzare WHERE COUNT(*) > 5 invece di HAVING.
  • Contare dopo uno join che ha moltiplicato le linee.
  • Dimentica che COUNT(colonne) ignora i valori NULL.
  • Mescola periodi diversi nello stesso indicatore.
Controllo semplice: calcola prima il totale complessivo, poi confrontalo con la somma dei gruppi. Una discrepanza deve essere spiegata dal filtro o dai valori NULL.

La tua lista di controllo prima di condividere il risultato

Imposta il livello previsto (una riga per città, cliente o mese), quindi scegli le aggregazioni. Applicare il filtro del periodo con WHERE, la soglia aziendale con HAVING e un ordinamento leggibile con ORDER BY.

Infine, controlla manualmente alcuni gruppi e documenta la definizione dei KPI. Una query breve ma ambigua resta meno utile di un calcolo esplicito e riproducibile.

Trova il tuo punto di partenza.

Rispondi a dieci domande e ricevi un consiglio didattico adatto.

Fai il test gratuito