Oracle pl/sql按案例排序

Oracle pl/sql按案例排序,oracle,sql-order-by,Oracle,Sql Order By,我需要以特定格式排列以下数据 Code Qty R 200 R 0 A 100 A 0 所需输出格式 Active (A) with stock (Qty > 0) Reserve (R) with stock (Qty > 0) Active (A) without stock (Qty = 0) Reserve (R) without stock (Qty = 0) 在上述情况下 A 100 R 200 A 0 R 0 请帮我搞定这家伙。我试

我需要以特定格式排列以下数据

Code    Qty
R   200
R   0
A   100
A   0
所需输出格式

 Active (A) with stock (Qty > 0)
 Reserve (R) with stock (Qty > 0)
 Active (A) without stock (Qty = 0)
 Reserve (R) without stock  (Qty = 0)
在上述情况下

A 100
R 200
A 0
R 0

请帮我搞定这家伙。我试着用case-in-order-by,但最终还是找不出答案。

你试着用
按案例排序是对的。以下内容将给出您想要的结果:

ORDER BY CASE
           WHEN CODE = 'A' AND QTY > 0 THEN 1
           WHEN CODE = 'R' AND QTY > 0 THEN 2
           WHEN CODE = 'A' AND QTY = 0 THEN 3
           WHEN CODE = 'R' AND QTY = 0 THEN 4
         END;

祝你好运

编辑 为了完成OP在评论中提到的附加要求,可以通过
将第二种排序添加到
订单中:

ORDER BY CASE
           WHEN CODE = 'A' AND QTY > 0 THEN 1
           WHEN CODE = 'R' AND QTY > 0 THEN 2
           WHEN CODE = 'A' AND QTY = 0 THEN 3
           WHEN CODE = 'R' AND QTY = 0 THEN 4
         END ASC,
         CASE
           WHEN CODE = 'A' AND QTY > 0 THEN QTY
           ELSE NULL
         END DESC;

对于您提供的特定数据和需求,您实际上不需要一个
案例
表达式。(实际上我在撒谎-
sign()
当然是
case
的一种形式。)

如果有多行具有相同的
code
组合和正
qty
qty=0
,则存在歧义;和你的问题陈述一样模棱两可

with
  inputs as (
    select 'R' code, 200 qty from dual union all
    select 'R'     ,   0     from dual union all
    select 'A'     , 100     from dual union all
    select 'A'     ,   0     from dual
  )
select   *
from     inputs
order by sign(qty) desc, code
;

CODE  QTY
---- ----
A     100
R     200
A       0
R       0

我这里还有一个要求。如果有多个“A”代码,例如A 100 A 50 A 120,在这种情况下,它需要像A 120 A 100 A50一样数量递减