SQL несколько столбцов

635

Я пытаюсь сортировать по нескольким столбцам в SQL, и в разных направлениях. column1будет отсортирован по убыванию и по column2возрастанию.

Как я могу это сделать?

Сеньор рединольд фрэнсис
источник
85
Это первый результат "поиска в Google". По крайней мере это было, когда я гуглил "упорядочение по двум столбцам". Это чертовски намного более читабельно, чем эквивалентная официальная страница документации, которая даже не появилась на моей первой странице результатов, пока я не изменил свой запрос на «mysql» order by »
Эндрю Мартин
11
Учитывая, как часто такой вопрос стоит на первом месте в Google, я всегда нахожу ужасным, что люди отвечают с ним. ТАК или здесь, чтобы ответить или нет, и я не могу понять, почему перенаправление трафика сайта - хорошая вещь
user001

Ответы:

1023
ORDER BY column1 DESC, column2

Это сортирует все column1сначала (по убыванию), а затем column2(по возрастанию, что по умолчанию), когда column1поля для двух или более строк равны.

Игнасио Васкес-Абрамс
источник
2
здесь, как заказать или column1 или column2?
PoliDev
@PoliDev, сначала заказы по столбцу1 в порядке DESCending и по столбцу2 (в порядке ASCending)
zaheer
110
Для ясности, это сортирует все column1сначала, а затем по column2каждому, когда column1поля для двух строк равны.
Ник Бенес
2
Он будет работать для любого количества выражений ( не только для столбцов), вплоть до предела вашей СУБД.
Игнасио Васкес-Абрамс
2
@NickBenes ... или вы могли бы сказать: он сортирует, column2а затем выполняет СТАБИЛЬНУЮ сортировку column1. Это более понятно для людей, которые знают, что такое стабильная сортировка.
Атом
356

В других ответах отсутствует конкретный пример, так что вот оно:

Учитывая следующие Человек таблицы:

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

Если вы выполните запрос ниже:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

Набор результатов будет выглядеть так:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
Томас КГ де Вильена
источник
23
Этот ответ является отличным дополнением к очень полезному и краткому принятому ответу.
enderland
3
Это хороший пример, многие думают, что как вы можете отсортировать 2 столбца за один раз, что на самом деле не происходит, даже если вы поставили 2 столбца для запроса заказа
Мухаммед Фараз
Это дает одинаковые результаты, когда мы сортируем по трем столбцам, а порядок сортировки по первому столбцу одинаков, а в остальном все иначе. Пример: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc Есть ли способ, которым мы можем преодолеть это?
Парамеш Корракути
1
@ParameshKorrakuti: Это ожидаемый результат. Результирующий порядок в вашем примере будет отличаться только в том случае, если будут дубликаты FirstName, LastNameзаписей с отличными друг от другаYearOfBirth
Томас CG де Вильена
Спасибо за пример, это заставляет таких как я понять.
thippu
136
SELECT  *
FROM    mytable
ORDER BY
        column1 DESC, column2 ASC
Quassnoi
источник
19

Порядок размещения нескольких столбцов зависит от соответствующих значений обоих столбцов: Вот мой пример таблицы, где два столбца имеют имена с алфавитами и числами, а значения в этих двух столбцах имеют порядки asc и desc .

введите описание изображения здесь

Теперь я выполняю Order By в этих двух столбцах, выполнив следующую команду:

введите описание изображения здесь

Теперь снова я вставляю новые значения в эти два столбца, где значение Alphabet в порядке ASC :

введите описание изображения здесь

и столбцы в примере таблицы выглядят так. Теперь снова выполните ту же операцию:

введите описание изображения здесь

Вы можете видеть, что значения в первом столбце расположены в порядке desc, но второй столбец не в порядке ASC.

Джейсон Кларк
источник
также вставьте эти данные тоже (g, 10),(g,12). Затем, запустив свой запрос по порядку, вы получите второй столбец как ASCзаказ (это означаетg-10,g-11,g-12)
Pugal
6

Вы можете использовать несколько заказов на несколько условий,

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 
Атик Саркер
источник
Работает ли индексирование, если я использую "CASE" внутри "ORDER BY"?
Русонур Джаман