Voltar para a lista de artigos Artigos
6 minutos de leitura

Como ordenar valores em uma ordem específica em SQL

Às vezes, você será obrigado a ordenar seus dados de uma determinada forma, e muitas vezes o uso de modificadores de ordenação típicos como ASC e DESC não são suficientes. Este artigo mostrará como usar a declaração CASE para ordenar seus dados exatamente como você precisa que eles sejam.

Você já precisou encomendar seus dados de uma maneira muito específica? Um dos melhores métodos para lidar com a classificação complexa é usar CASE. A declaração CASE é bastante útil, pois permite acrescentar lógica if-else às suas consultas. Vamos usar esta lógica SQL ORDER BY valores específicos. Você pode saber mais sobre a declaração CASE lendo este artigo que explica o CASE juntamente com exemplos úteis.

Demonstraremos esta ordem SQL personalizada através de 3 exemplos distintos, envolvendo diferentes tipos de dados como números inteiros, valores de texto e datas.

Para nossos exemplos, usaremos o orders mesa. Esta tabela contém informações sobre os pedidos de produtos que nossa empresa recebeu.

orders

idlocationcountorder_date
1New York132021-05-21
2Boston212020-11-12
3Chicago42021-03-18
4Toronto102019-12-13
5New York202020-01-27
6Boston332019-04-03
7Memphis72021-05-04
8Cleveland182020-07-06
9Philadelphia62019-04-22
10Washington352021-01-07

Ordenação personalizada com base na coluna Inteiro

Recebemos notícias de nosso gerente sobre como eles querem que estes dados sejam encomendados. Nosso resultado deve seguir as seguintes regras:

  • Primeiro, mostrar as ordens onde entre 10 e 20 itens foram encomendados.
  • Depois, mostrar as ordens em que menos de 10 itens foram encomendados.
  • Finalmente, mostrar os pedidos em que mais de 20 itens foram encomendados.

As exigências são bem claras, vamos ao trabalho! Depois de algum tempo, produzimos a seguinte consulta SQL:

SELECT id, count
FROM orders
ORDER BY CASE WHEN count BETWEEN 10 AND 20 THEN 1
              WHEN count < 10 THEN 2
              ELSE 3END

Vamos quebrar isto.

Selecionamos o id e a contagem dos pedidos a serem exibidos. Depois disso, entramos diretamente na ordem de nossos resultados, usando a cláusula ORDER BY.

Você pode usar o CASE para especificar uma chave de ordenação na cláusula ORDER BY, que é exatamente o que estamos fazendo aqui. Damos ao primeiro caso um valor de chave de ordenação de 1:

CASE WHEN count BETWEEN 10 AND 20 THEN 1

Damos ao segundo caso um valor de chave de ordenação de 2:

WHEN count < 10 THEN 2

Isto garante que os resultados do primeiro caso serão mostrados antes do segundo caso. Os últimos dados que queremos que sejam exibidos é onde a contagem da ordem está acima de 20. Podemos atribuir-lhes um valor chave de ordenação de 3..:

ELSE 3

Muito bem, vamos executar nossa consulta! Isto resulta na devolução dos seguintes registros:

idcount
113
410
520
818
34
77
96
221
633
1035

Funcionou! Os itens com uma contagem de ordem entre 10 e 20 são mostrados primeiro. Em seguida vêm as ordens onde 10 itens foram encomendados. E finalmente, são mostradas as contagens de pedidos acima de 20.

Este é um uso bastante avançado do CASE. Você também pode usar a declaração CASE com comandos de modificação de dados como INSERT e UPDATE. Confira este post no blog sobre o tópico se você estiver interessado em aprender como.

Ordenação personalizada com base em uma coluna de texto

Vejamos outro exemplo, exceto que desta vez usaremos uma coluna de texto para especificar a ordem em que nossos dados devem aparecer.

Acabamos de receber notícias de nosso chefe que precisamos exibir alguns dos dados de nossa orders tabela e classificá-la com base no local em que a ordem foi feita.

Eles querem ver primeiro os pedidos para Nova York, seguidos dos pedidos que ocorreram em Boston, e depois os pedidos em Toronto. O resto dos dados dos pedidos também deve ser exibido, mas o pedido não importa para os outros locais. Vamos começar a trabalhar.

Chegamos à seguinte consulta:

SELECT id, location, count, order_date
FROM orders
ORDER BY CASE WHEN location = 'New York' THEN 1
              WHEN location = 'Boston' THEN 2
              WHEN location = 'Toronto' THEN 3
              ELSE 4 END

Desta vez, estamos selecionando todas as colunas. O uso de ORDER BY e CASE é similar ao nosso exemplo anterior. Se você quiser saber mais sobre este tópico, confira este artigo que cobre extensivamente os tipos de dados SQL.

Observe que a ordem que usamos em nossa expressão CASE WHEN corresponde exatamente às nossas exigências, mostrando Nova Iorque, Boston, depois Toronto. Vamos executar esta consulta e ver se somos bem sucedidos.

idlocationcountorder_date
1New York132021-05-21
5New York202020-01-27
2Boston212020-11-12
6Boston332019-04-03
4Toronto102019-12-13
3Chicago42021-03-18
8Cleveland182020-07-06
7Memphis72021-05-04
9Philadelphia62019-04-22
10Washington352021-01-07

Êxito! É exatamente assim que queremos que nossos dados sejam encomendados. Agora podemos passar ao nosso exemplo final. Até agora, temos trabalhado tanto com números como com tipos de dados de texto.

Classificação personalizada com base na coluna Data

Para nosso exemplo final, utilizaremos o datatype e demonstraremos como incorporar valores de data em seu CASE tipos personalizados.

Outro pedido veio de nosso gerente. Eles querem que os dados sejam exibidos em uma determinada ordem com base na coluna de datas, order_date. Aqui está o que nos foi dito:

  • Exibir todos os pedidos do ano corrente (2021) e ordenar estas datas pelo mês e dia do mês em ordem crescente.
  • A seguir, mostrar as datas dos anos anteriores, e também ordená-las por dia e mês.

Vamos escrever nossa consulta e dar nosso exemplo final de um SQL ORDER BY CASE.

SELECT id, location, count, order_date
FROM orders
ORDER BY 
CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1
     WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2
     ELSE 3 
END ASC, order_date ASC

Há muito o que quebrar aqui! Vamos entrar nisso. Examinem o seguinte trecho:

CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1

EXTRACT é usado para obter o ano a partir da data do pedido. CURDATE() é usado para obter a data atual. Você pode ver mais funções como estas neste curso de Funções Padrão SQL que ensina como processar dados numéricos, textos e outros tipos de dados com as funções mais utilizadas do SQL.

Comparamos o ano de order_date com o ano a partir da data atual. Conseguimos que este conjunto de dados apareça primeiro, definindo a chave de ordenação como 1.

WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2

Isto é semelhante à última seção, exceto que estamos usando a data do último ano (YEAR FROM CURDATE()) - 1)

Finalmente, obtemos o resto dos resultados para aparecer usando este trecho:

ELSE 3

Desta vez, também classificamos por order_date ASC. Isto garante que os meses e dias desse mês sejam ordenados em ordem ascendente.

Vamos ver o resultado da execução desta consulta:

idlocationcountorder_date
10Washington352021-01-07
3Chicago42021-03-18
7Memphis72021-05-04
1New York132021-05-21
5New York202020-01-27
8Cleveland182020-07-06
2Boston212020-11-12
6Boston332019-04-03
9Philadelphia62019-04-22
4Toronto102019-12-13

Nossos resultados estão aparecendo exatamente como os queremos! Os últimos anos estão aparecendo primeiro, e cada conjunto de resultados por ano é ordenado pelos meses e dias daquele ano.

ORDEM SQL POR Valores Específicos

Isso conclui nosso olhar sobre os tipos personalizados. Aumentamos a complexidade de cada tipo com cada exemplo. Nesta etapa, você deverá ser capaz de aplicar os princípios deste artigo a um problema que você possa estar enfrentando. Se você precisar ver mais exemplos, confira este post no blog sobre como classificar os registros com a cláusula ORDER BY. Este é considerado um tópico SQL bastante avançado. Para ver problemas SQL mais avançados, confira este SQL Avançado Learning Track from LearnSQL.com.br.