简体   繁体   中英

Sorting a table result based on a column but without it's natural ordering?

I want to order the employees based on their designation; ie Not the natural order of the job_name (Alphabetical) but in the following order

President -> Manager -> Clerk -> Salesman.

I was thinking of creating a view of job_name an priority and then using that to sort the table.

Is there any way to do it without using any other view for the same?

Employee sample table

 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

You can use a case statement for that:

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  

In supplement to sgeddes' answer, case takes another, slightly more compact form also:

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 also supports something called FIELD:

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

Unlike CASE, it's not standard SQL, so that's a reason not to use it, but it conceptually does the same thing as the first example

Note that your data contains ANALYST, but you didn't code for this

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM