La condizione è su una linea o su un gruppo?
Uno stato o una data appartiene a una riga di origine: utilizzare WHERE. Dopo il raggruppamento esiste un totale, una media o un numero di ordini: utilizzare HAVING.
L'ordine ne modifica il significato. Escludere le righe cancellate prima di SUM non equivale a calcolare tutti gli stati e poi nascondere determinati gruppi.
La domanda è stata spiegata
Inizia definendo cosa dovrebbe rappresentare una riga del risultato. Questa decisione determina le colonne, i raggruppamenti e i controlli necessari.
L'esempio seguente isola il meccanismo principale. Eseguilo, osserva il risultato, quindi modifica una clausola alla volta per comprenderne l'effetto.
SELECT id_client, COUNT(*) AS commandes_payees
FROM commandes
WHERE statut = 'Pagato'
GROUP BY id_client
HAVING COUNT(*) >= 2;Leggi il risultato come un analista
WHERE prepara solo ordini pagati. GROUP BY crea una riga per cliente, quindi HAVING mantiene volumi di almeno due.
Separa mentalmente questi passaggi e monitora il numero di record restituiti in ciascuno di essi quando la query diventa complessa.
- Formulare il perimetro delle linee.
- Imposta il livello di dettaglio per i gruppi.
- Applica la soglia all'aggregazione.
- Confrontare il totale complessivo con la somma dei gruppi.
Errori che distorcono l'analisi
Una query può essere valida senza rispondere correttamente alla domanda. Gli errori più costosi sono spesso silenziosi: perimetro errato, linea moltiplicata o valore mancante interpretato come zero.
Prima di condividere il risultato, confrontalo con un piccolo campione calcolato manualmente e mantieni la definizione dell'ambito con la query.
- Scrivere WHERE COUNT(*).
- Filtrare importo >= soglia anziché SUM(importo) >= soglia.
- Dimentica GROUP BY.
- Confronta gruppi costruiti con perimetri diversi.
Mettiti in pratica
Esegui l'esercizio HAVING sul paniere medio, quindi modifica la soglia per osservare i gruppi mantenuti.
Il simulatore SQL di SQL.tn esegue solo query di lettura su dati fittizi nel tuo browser. Puoi provare più scritture e confrontare i risultati senza installare alcun software.
Verifica la differenza su dati concreti
Chi ha pagato più di 100 € in totale? Emma ha pagato 60 € e poi 70 €. James ha pagato 80 € e ha anche un ordine annullato da 100 €. Olivia ha pagato esattamente 100 €.
| customer_name | amount | status |
|---|---|---|
| Emma | 60 | paid |
| Emma | 70 | paid |
| James | 80 | paid |
| James | 100 | cancelled |
| Olivia | 100 | paid |
SELECT customer_name, SUM(amount) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY customer_name
HAVING SUM(amount) > 100
ORDER BY customer_name;WHERE elimina l’ordine annullato prima del calcolo. GROUP BY riunisce gli acquisti per cliente. HAVING conserva i totali strettamente superiori a 100 €: rimane solo Emma, con 130 €.
Prova a sostituire HAVING con AND amount > 100 in WHERE: non rimane nessuna riga. Hai filtrato i singoli ordini, non i totali. Con >= 100 in HAVING sarebbe inclusa anche Olivia.
Ambiente SQL nel browser
Verifica la differenza su dati concreti
Esegui una query di lettura sui dati fittizi di questo esercizio. Nulla viene inviato a SQL.tn.
