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一样数量递减