Ordenação de Várias Colunas SQL


635

Estou tentando classificar por várias colunas no SQL e em direções diferentes. column1seria ordenado descendente e column2ascendente.

Como posso fazer isso?


85
Este é o primeiro resultado das "respostas do Google". Pelo menos foi quando pesquisei "ordenação sql por duas colunas". É muito mais legível do que a página oficial equivalente do documento, que nem apareceu na minha primeira página de resultados até que eu mudei minha consulta para "mysql 'order by'"
Andrew Martin

11
Dada a frequência com que uma pergunta de SO aparece no topo do Google, sempre acho terrível que as pessoas respondam com ela. SO está aqui para responder ou não, e eu não consigo entender por que direcionar o tráfego do site é uma coisa boa #
user001

Respostas:


1023
ORDER BY column1 DESC, column2

Isso classifica tudo por column1(decrescente) primeiro e depois por column2(crescente, que é o padrão) sempre que os column1campos para duas ou mais linhas forem iguais.


2
aqui como encomendar a coluna1 ou a coluna2?
PoliDev

@PoliDev, It primeiras ordens por column1 em ordem decrescente e o por column2 (em ordem crescente)
zaheer

110
Para maior clareza, isso classifica tudo column1primeiro e depois column2sempre que os column1campos de duas linhas forem iguais.
Nick Benes

2
Ele funcionará para qualquer número de expressões ( não apenas colunas), até o limite do seu RDBMS.
Ignacio Vazquez-Abrams

2
@NickBenes ... ou você poderia dizer: classifica column2e executa a classificação STABLE por column1. Isso fica mais claro para as pessoas que sabem o que é uma classificação estável.
Atom

356

As outras respostas não têm um exemplo concreto, então aqui vai:

Dada a seguinte tabela Pessoas :

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826

Se você executar a consulta abaixo:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

O conjunto de resultados ficará assim:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706

23
Esta resposta é um ótimo complemento para a resposta muito útil e curta aceita.
Enderland 30/05

3
O é um bom exemplo, muitos pensam que, como você pode tipo 2 colunas em tempo único que realmente não acontece mesmo se você colocar 2 colunas para consulta fim
Muhammad Faraz

Ele fornece os mesmos resultados quando classificamos com três colunas e a ordem de classificação da primeira coluna é a mesma e o resto é diferente. Ex .: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc Existe alguma maneira de superar isso?
Paramesh Korrakuti

1
@ParameshKorrakuti: Esse é o resultado esperado. A ordenação resultando no seu exemplo só seria diferente se havia duplicado FirstName, LastNameentradas com distintaYearOfBirth
Thomas CG de Vilhena

Obrigado pelo exemplo, faz com que pessoas como eu entendam.
thippu 9/01

136
SELECT  *
FROM    mytable
ORDER BY
        column1 DESC, column2 ASC

19

A ordenação de várias colunas depende dos valores correspondentes de ambas as colunas: Aqui está o meu exemplo de tabela, onde estão duas colunas nomeadas com alfabetos e números e os valores nessas duas colunas são ordens asc e desc .

insira a descrição da imagem aqui

Agora eu executo Order By nessas duas colunas executando o comando abaixo:

insira a descrição da imagem aqui

Agora, novamente, insiro novos valores nessas duas colunas, onde o valor do alfabeto na ordem ASC :

insira a descrição da imagem aqui

e as colunas na tabela Exemplo ficam assim. Agora, novamente, execute a mesma operação:

insira a descrição da imagem aqui

Você pode ver que os valores na primeira coluna estão na ordem desc, mas a segunda coluna não está na ordem ASC.


Também insira esses dados também (g, 10),(g,12). Em seguida, execute sua consulta por ordem e você obtém a segunda coluna como ASCordem (isso significag-10,g-11,g-12)
Pugal

6

Você pode usar pedidos múltiplos em várias condições,

ORDER BY 
     (CASE 
        WHEN @AlphabetBy = 2  THEN [Drug Name]
      END) ASC,
    CASE 
        WHEN @TopBy = 1  THEN [Rx Count]
        WHEN @TopBy = 2  THEN [Cost]
        WHEN @TopBy = 3  THEN [Revenue]
    END DESC 

A indexação funciona. Se eu usar "CASE" em "ORDER BY"?
Rousonur Jaman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.