Сортировка результата таблицы по столбцу, но без естественного упорядочения? - PullRequest
0 голосов
/ 11 декабря 2018

хочу заказать сотрудников по их назначению;т.е. не естественный порядок имени задания (по алфавиту), а в следующем порядке

Президент -> Менеджер -> Клерк -> Продавец.

Я думал о созданиипредставление приоритета job_name и затем использование его для сортировки таблицы.

Есть ли способ сделать это без использования какого-либо другого представления для того же самого?

Пример таблицы сотрудника

 emp_id | emp_name | job_name  | manager_id | hire_date  | salary  | commission | dep_id
--------+----------+-----------+------------+------------+---------+------------+--------
  68319 | KAYLING  | PRESIDENT |            | 1991-11-18 | 6000.00 |            |   1001
  66928 | BLAZE    | MANAGER   |      68319 | 1991-05-01 | 2750.00 |            |   3001
  67832 | CLARE    | MANAGER   |      68319 | 1991-06-09 | 2550.00 |            |   1001
  65646 | JONAS    | MANAGER   |      68319 | 1991-04-02 | 2957.00 |            |   2001
  67858 | SCARLET  | ANALYST   |      65646 | 1997-04-19 | 3100.00 |            |   2001
  69062 | FRANK    | ANALYST   |      65646 | 1991-12-03 | 3100.00 |            |   2001
  63679 | SANDRINE | CLERK     |      69062 | 1990-12-18 |  900.00 |            |   2001
  64989 | ADELYN   | SALESMAN  |      66928 | 1991-02-20 | 1700.00 |     400.00 |   3001
  65271 | WADE     | SALESMAN  |      66928 | 1991-02-22 | 1350.00 |     600.00 |   3001
  66564 | MADDEN   | SALESMAN  |      66928 | 1991-09-28 | 1350.00 |    1500.00 |   3001
  68454 | TUCKER   | SALESMAN  |      66928 | 1991-09-08 | 1600.00 |       0.00 |   3001
  68736 | ADNRES   | CLERK     |      67858 | 1997-05-23 | 1200.00 |            |   2001
  69000 | JULIUS   | CLERK     |      66928 | 1991-12-03 | 1050.00 |            |   3001
  69324 | MARKER   | CLERK     |      67832 | 1992-01-23 | 1400.00 |            |   1001

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

В дополнение к ответу sgeddes, case принимает другую, несколько более компактную форму:

SELECT * FROM employee 
ORDER BY 
   CASE job_name
     WHEN 'PRESIDENT' then 0
     WHEN 'MANAGER' then 1
     WHEN 'CLERK' then 2
     WHEN 'SALESMAN' then 3
     ELSE 4
   END

MySQL также поддерживает что-то под названием FIELD:

SELECT * FROM employee 
ORDER BY FIELD(job_name,
    'PRESIDENT',
    'MANAGER',
    'CLERK',
    'SALESMAN');

В отличие от CASE, это не такстандартный SQL, так что это причина не использовать его, но концептуально он делает то же самое, что и первый пример

Обратите внимание, что ваши данные содержат ANALYST, но вы не кодировали для этого

0 голосов
/ 11 декабря 2018

Для этого вы можете использовать оператор case:

select *
from yourtable
order by case when job_name = 'President' then 1
              when job_name = 'Manager' then 2
              when job_name = 'Clerk' then 3
              when job_name = 'Salesman' then 4
         end, emp_name  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...