Сортировка по нескольким столбцам, но разным критериям

#sql-server #sql-server-2017

Вопрос:

У меня есть таблица в SQL SERVER, из которой я хочу выбрать записи, используя порядок, но у меня другой сценарий. Пожалуйста, взгляните на нижеприведенную таблицу.

 EmployeeCode | EmployeeArea
    001      |     8568
    002      |     4549
    004      |     4549
    005      |     8568
    003      |     4549
    006      |     7777
    010      |     4549
    007      |     8568
    008      |     7777
    009      |     4549
 

Как показано выше, у меня есть два поля Код сотрудника и Область сотрудника. Теперь я хочу сначала отсортировать записи по кодам сотрудников, а затем по области сотрудников, но не стандартным способом. Пожалуйста, смотрите ниже желаемый o/p для лучшего понимания

   EmployeeCode   | EmployeeArea
        001      |     8568
        005      |     8568
        007      |     8568
        002      |     4549
        003      |     4549
        004      |     4549
        009      |     4549
        010      |     4549
        006      |     7777
        008      |     7777
 

Как показано выше, первая сортировка выполняется по коду сотрудника, и в соответствии с этим Область сотрудников первого сотрудника(ex 001) (8568) все сотрудники с кодом области 01 будут размещены вместе, и они будут размещены в порядке asc по коду сотрудника.
Я устал использовать несколько способов, таких как group by, CTE, временные таблицы, но не могу получить желаемый результат. Любая помощь будет высоко оценена.

Комментарии:

1. Было бы лучше, если бы Emp 001 не имел области 01, но был бы выше, поэтому я бы сказал, что немного перепутайте числа.

2. Обновлено в соответствии с просьбой.

3. Ларну, если вы внимательно проверите данные, мне конкретно нужно сначала отсортировать по коду сотрудника, так как первым приоритетом является код сотрудника, а затем область сотрудников. Потому что я хочу упорядочить данные только по коду сотрудника.

4. @Niks мой (теперь удаленный) комментарий был сделан до того, как вы полностью изменили данные.

Ответ №1:

Похоже, что вам нужно окно MIN в ORDER BY :

 SELECT *
FROM (VALUES('001',8568),
            ('002',4549),
            ('004',4549),
            ('005',8568),
            ('003',4549),
            ('006',7777),
            ('010',4549),
            ('007',8568),
            ('008',7777),
            ('009',4549))V(EmployeeCode,EmployeeArea)
ORDER BY MIN(EmployeeCode) OVER (PARTITION BY EmployeeArea),
         EmployeeCode,
         EmployeeArea;
 

Комментарии:

1. Отлично. Я не пробовал этого раньше. Кажется, это работает идеально.

Ответ №2:

Если я вас понимаю, вам нужно просто упорядочить по обоим столбцам:

 SELECT EmplyeeCode, EmplyeeArea
FROM yourTable
ORDER BY EmplyeeArea, EmplyeeCode
 

Здесь я создал демо-версию на DB<>FIDDLE<>. Результат именно такой, как вы хотите.

Комментарии:

1. Марко, спасибо за ответ, но я обновил вопрос, чтобы лучше понять. Если вы видите, первая сортировка по области сотрудников не будет работать.