Problema:
Você agregou dados em grupos, mas deseja classificar os registros em ordem decrescente pelo número de elementos nos grupos.
Exemplo:
Nosso banco de dados tem uma tabela chamada
user
com dados nas seguintes colunas:id
, first_name
, last_name
e country
. id | first_name | last_name | país |
---|---|---|---|
1 | Lisa | Williams | Inglaterra |
2 | Gary | Anders | Polônia |
3 | Tom | Williams | Polônia |
4 | Michael | Marrom | França |
5 | Susan | Smith | EUA |
6 | Ana | Jones | EUA |
7 | Ellie | Moleiro | Polônia |
Vamos criar um relatório sobre nossos usuários. Agruparemos os resultados por
country
e conte o número de usuários de cada país. Mas também classificaremos os grupos em ordem decrescente por número de usuários. Dessa forma, os países com maior número de usuários aparecerão no topo. Solução:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
país | contagem(id) |
---|---|
Polônia | 3 |
EUA | 2 |
Inglaterra | 1 |
França | 1 |
Discussão:
Para ordenar os registros selecionados pelo número de elementos em cada grupo, você usa o
ORDER BY
cláusula. O primeiro passo é usar o
GROUP BY
cláusula para criar os grupos (no nosso exemplo, agrupamos pelo country
coluna). Então, na cláusula ORDER BY, você usa a função agregada COUNT, que conta o número de valores na coluna de sua escolha; em nosso exemplo, contamos IDs distintos com COUNT(id)
. Isso efetivamente conta o número de elementos em cada grupo. O ORDER BY
cláusula então classifica os grupos de acordo com esse cálculo. Como de costume, você pode usar a ordem crescente ou decrescente com
ORDER BY
. Se você quiser ordem decrescente (como neste exemplo), use o DESC
palavra-chave. A ordem crescente não precisa de nenhuma palavra-chave porque é o padrão, mas você pode usar o ASC
palavra-chave se você quiser ser explícito. Este é o mesmo exemplo, mas com os resultados classificados em ordem crescente:Solução:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Aqui está o resultado:
país | contagem(id) |
---|---|
Inglaterra | 1 |
França | 1 |
EUA | 2 |
Polônia | 3 |