Problema:
Hai aggregato i dati in gruppi, ma desideri ordinare i record in ordine decrescente in base al numero di elementi nei gruppi.
Esempio:
Il nostro database ha una tabella denominata user
con i dati nelle seguenti colonne:id
, first_name
, last_name
e country
.
id | nome | cognome | paese |
---|---|---|---|
1 | Lisa | Williams | Inghilterra |
2 | Gary | Anders | Polonia |
3 | Tom | Williams | Polonia |
4 | Michele | Marrone | Francia |
5 | Susana | Fabio | Stati Uniti |
6 | Anna | Jones | Stati Uniti |
7 | Elli | Mugnaio | Polonia |
Creiamo un report sui nostri utenti. Raggrupperemo i risultati per country
e contare il numero di utenti di ogni paese. Ma ordineremo anche i gruppi in ordine decrescente in base al numero di utenti. In questo modo, i paesi con il maggior numero di utenti verranno visualizzati in alto.
Soluzione:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
paese | count(id) |
---|---|
Polonia | 3 |
USA | 2 |
Inghilterra | 1 |
Francia | 1 |
Discussione:
Per ordinare i record selezionati in base al numero degli elementi in ciascun gruppo, utilizzare il ORDER BY
clausola.
Il primo passo è usare il GROUP BY
clausola per creare i gruppi (nel nostro esempio, raggruppiamo per country
colonna). Quindi, nella clausola ORDER BY, utilizzi la funzione di aggregazione COUNT, che conta il numero di valori nella colonna di tua scelta; nel nostro esempio, contiamo ID distinti con COUNT(id)
. Questo conta effettivamente il numero di elementi in ciascun gruppo. Il ORDER BY
La clausola quindi ordina i gruppi in base a tale calcolo.
Come al solito, puoi utilizzare sia l'ordine crescente che quello decrescente con ORDER BY
. Se vuoi un ordine decrescente (come in questo esempio), usa il DESC
parola chiave. L'ordine crescente non richiede alcuna parola chiave perché è l'impostazione predefinita, ma puoi utilizzare l'ASC
parola chiave se vuoi essere esplicito. Questo è lo stesso esempio ma con i risultati ordinati in ordine crescente:
Soluzione:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Ecco il risultato:
paese | count(id) |
---|---|
Inghilterra | 1 |
Francia | 1 |
USA | 2 |
Polonia | 3 |