基于条件的排序表

时间:2012-07-18 10:11:47

标签: sql oracle sorting sql-order-by

我必须按照以下规则对EMPLOYEE表中的员工进行排序:当他们的部门是SALES时,按经验排序,否则按SALARY排序

enter image description here

这就是我的尝试:

select FNAME||' '||LNAME as emp_name,salary,HIRE_DATE from employee 
where dept_id=(select dept_id from department where name='SALES') order by HIRE_DATE asc;
UNION
select FNAME||' '||LNAME as emp_name,salary,HIRE_DATE from employee
where dept_id NOT IN (select dept_id from department where name='SALES') order by salary desc;

因为我认为有两个订单而抛出错误。任何解决方案?

4 个答案:

答案 0 :(得分:3)

试试这个:

select FNAME||' '||LNAME as emp_name,salary,HIRE_DATE from employee  E
join department D
on E.dept_id=D.dept_id
 order by (case when D.name='SALES' then HIRE_DATE end),
           (case when D.name<>'SALES' then salary end) desc

答案 1 :(得分:2)

首先显示销售部门,按hire_date排序。其他部门接下来按薪水排序。

select FNAME||' '||LNAME as emp_name,salary,HIRE_DATE 
  from employee
 inner join department
    on employee.dept_id = department.dept_id
 order by
 -- Sales department is on top. Swap 0 and 1 if you want sales on bottom
       case when department.name = 'SALES'
            then 0
            else 1
       end,
 -- And employees are sorted by hire_date
       case when department.name = 'SALES'
            then employee.HIRE_DATE
            else null
       end,
 -- Employees from other departments are sorted by salary
       employee.Salary desc

答案 2 :(得分:1)

使用decode:

SELECT   fname || ' ' || lname AS emp_name
        ,salary
        ,hire_date
    FROM employee e
        ,department d
   WHERE e.dept_id = d.dept_id
ORDER BY decode(d.name,'SALES',experience,salary)
;

另见http://sqlfiddle.com/#!4/afa6f/1

答案 3 :(得分:0)

SELECT e.fname||' '||e.lname as emp_name, e.salary, e.hire_date
FROM employee e, department d
WHERE e.dept_id = d.dept_id 
ORDER BY
CASE 
WHEN d.name ='SALES' then
hire_date ASC
ELSE
salary DESC
END 

行。道歉,试试这个 - 可能已经回答过了。