Впорядкування декількох стовпців SQL


635

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

Як я можу це зробити?


85
Це перший результат "гугл відповідей". Принаймні, це було, коли я гуглив "замовлення sql на дві колонки". Це пекло набагато легше для читання, ніж еквівалентна офіційна сторінка doc, яка навіть не з’явилася на моїй першій сторінці результатів, поки я не змінив запит на "mysql 'order by" "
— Ендрю Мартін

11
З огляду на те, як часто питання SO надходить на вершину Google, мені завжди страшно, що люди відповідають на нього. Так що тут або відповісти, чи ні, і я не можу зрозуміти, чому спрямування трафіку на сайті - це добре
— user001

Відповіді:


1023
ORDER BY column1 DESC, column2

Це сортує все за column1(спаданням) спочатку, а потім column2(за зростанням, що є за замовчуванням), коли column1поля для двох або більше рядків рівні.


2
тут як замовити або колонку1 або колонку2?
— PoliDev

@PoliDev, Він спочатку замовляє колонку1 у порядку DESCending та the column2 (у порядку ASCending)
— zaheer

110
Для наочності це сортує все column1спочатку, а потім, column2коли column1поля на два ряди рівні.
— Нік Бенеш

2
Він буде працювати для будь-якої кількості виразів ( не тільки стовпців), аж до обмеження вашого RDBMS.
— Ігнасіо Васкес-Абрамс

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
Ця відповідь є чудовим доповненням до дуже корисної та короткої прийнятої відповіді.
— Ендерленд

3
Це хороший приклад, багато хто думає, що як можна сортувати 2 стовпчики одночасно, що насправді не відбувається, навіть якщо ви поставите 2 стовпчики для запиту замовлення
— Мухаммед Фараз

Це дає ті самі результати, коли ми сортуємо з трьома стовпцями, і порядок сортування перших стовпців однаковий, а в іншому все відрізняється. Наприклад: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc Чи є спосіб, що ми можемо це подолати?
— Параміш Корракуті

1
@ParameshKorrakuti: Очікуваний результат. Отримане впорядкування у вашому прикладі відрізнятиметься лише за наявності дублюючих FirstName, LastNameзаписів з чіткими ознакамиYearOfBirth
— Thomas CG de Vilhena

Дякую за приклад, це змушує людей, як я, розуміти.
— thippu


19

Упорядкування декількох стовпців залежить від відповідних значень обох стовпців: Ось мій приклад таблиці, де є два стовпчики з іменами Alphabets and Numbers, а значення цих двох стовпців - порядки asc та desc .

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

Тепер я виконую Order By у цих двох стовпцях, виконуючи команду нижче:

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

Тепер знову вставляю нові значення в ці два стовпці, де значення алфавіту в порядку ASC :

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

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

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

Ви можете бачити, що значення в першому стовпці знаходяться в порядку desc, але другий стовпець не в порядку ASC.


також вставити ці дані (g, 10),(g,12). Потім запустіть запит на замовлення, ви отримаєте другий стовпець як ASCзамовлення (це означаєg-10,g-11,g-12)
— Пугал

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"?
— Русонур Джаман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.