Oracle pl / sql заказ в каждом конкретном случае - PullRequest
1 голос
/ 03 апреля 2019

Мне нужно расположить приведенные ниже данные в определенном формате

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 для того, чтобы, но не смог со временем выяснить ответ.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Вы были правы, чтобы попробовать ORDER BY CASE.Следующее даст результаты, которые вы ищете:

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;

dbfiddle здесь

Удачи.

РЕДАКТИРОВАТЬ

Чтобы выполнить дополнительное требование, упомянутое OP в комментарии, в 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 ASC,
         CASE
           WHEN CODE = 'A' AND QTY > 0 THEN QTY
           ELSE NULL
         END DESC;

новое значение dbfiddle можно добавить

0 голосов
/ 03 апреля 2019

Для конкретных представленных вами данных и требований вам не нужно выражение case.(На самом деле я лгу - 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
...