7

我有一个查询应该根据列值以 asc 或 desc 排序结果。

例如

如果类型管理器的员工存在 THEN 按joining_date、bith_date ASC 排序,否则如果员工是开发人员 THEN 按joining_date、birth_date DESC 排序。

我想实现以下目标,但无法实现。

ORDER BY CASE WHEN employee_type = 'm'  
              THEN joining_date, birth_date ASC;
              WHEN employee_type = 'd' 
              THEN joining_date, birth_date  DESC; 
4

4 回答 4

15

好吧,经过一番研究,我得到了答案。

我们可以有条件地在 where 子句中添加多个列,如下所示:

ORDER BY DECODE(employee_type, 'm', joining_date, birth_date, salary) ASC,
         DECODE(employee_type, 'd', joining_date, birth_date, salary) DESC

这将根据employee_type 对结果进行排序。

于 2013-01-31T07:55:21.823 回答
5

我怀疑你想要这样的东西:

ORDER BY 
    employee_type DESC             -- first all the managers, then the developers
                                   -- and in every one of these two groups
  , joining_date                   -- first order by joining date
  , CASE WHEN employee_type = 'm'  -- and then either by
        THEN birth_date            -- birth date ascending for managers
        ELSE NULL
    END                            -- or
  , birth_date DESC ;              -- birth date descending for the rest (devs)
于 2013-01-31T08:11:09.507 回答
0

这个问题有点糟糕。

根据列值将结果排序为 asc 或 desc。

一列有许多值(因为有多行)。

现在,order by子句使用表达式并在其上排序行。该表达式应该是morphotropic(;))

因此,假设标准 oracle 的员工模式,经理是:

select * 
from emp e
where exists (select emp_id from emp where e.id=emp.mgr_id)

解决方法查询可能是:

Select e.id, e.name, e.birth_date,
  case 
  when   (select count(*)  
          from emp e 
          where exists (select emp_id from  emp where e.id=emp.mgr_id)
          ) --existence of manager
    > 0 then birth_date - to_date('1-Jan-1000','dd-mon-yyyy')
    else to_date('1-Jan-1000','dd-mon-yyyy') - birth_date
   end as tricky_expression
from emp A
order by 4;

该表达式是case; 使用常量(决定有经理的子查询)将值从正数更改为负数,即更改订单方向。

更新:评论中的详细信息:

select id, name, birth_date emp_type
from (
    Select id, name, birth_date, emp_type,
        case  when   cnt_mgr > 0 then birth_date - to_date('1-Jan-1000','dd-mon-yyyy')
          else to_date('1-Jan-1000','dd-mon-yyyy') - birth_date
        end as tricky_expression
    from(
        Select e.id, e.name, e.birth_date, emp_type,
           count(case when emp_type='M' then 1 else 0 end) over() as mgr_count
        from emp A
        where your_conditions
        )
     order by tricky_expression
)
where rownum=1;
于 2013-01-30T06:42:29.303 回答
0

如果公司中有经理,则此查询返回最年长的经理,否则 - 最年轻的开发人员。

select 
  id, name, birth_date, emp_type
from emp
where 
  id = (select 
           max(id) keep (dense_rank first order by 
             decode(emp_type, 'M', 1, 'D', 2),
             joining_date,
             decode(emp_type, 'M', 1, 'D', -1) * (birth_date - to_date('3000','yyyy')))
        from emp)
于 2013-01-30T08:20:51.157 回答