выбор кейса - PullRequest
       9

выбор кейса

0 голосов
/ 23 октября 2018
|AMNT1   |  AMNT2 |  Rank
__________________________
|  01    |      05 |     rank1   
|  05    |     10 |  rank2   
| 10     |     15 |  rank3  
___________________________

Мне нужен оператор case, который обеспечивает вывод rank1,rank2,rank3, когда значения между

1 and 5 rank1, 5 and 10 rank2 и т. Д.

У меня есть таблица сумм, котораяимеет значение deptid и сумму

, необходимый выход - ранг суммы депти, где необходимо получить ранг из таблицы рангов

Как мне написать запрос select и поместить его в оператор case?

оно должно быть динамическим (я имею в виду, что значение таблицы может измениться, но мой оператор case должен прочитать последнее значение и предоставить вывод)

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вы ищете нижеследующее утверждение:

select * from (select case when input_amt>AMNT1 and input_amt<AMNT2 THEN rank end  RANK
from ranktable) rnk
where rnk.RANK is not null
0 голосов
/ 25 октября 2018

Вот одна версия объединения с примерами данных в CTE:

with rankings (amnt1, amnt2, rank) as (
            select 1, 5, 'rank1' from dual
  union all select 5, 10, 'rank2' from dual
  union all select 10, 15, 'rank3' from dual
),
amount (deptid, amount) as (
            select 1, 0 from dual
  union all select 2, 1 from dual
  union all select 3, 4 from dual
  union all select 4, 5 from dual
  union all select 5, 6 from dual
  union all select 6, 9 from dual
  union all select 7, 10 from dual
  union all select 8, 11 from dual
  union all select 9, 15 from dual
  union all select 10, 16 from dual
)
-- actual query
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount < r.amnt2;

, которая дает тот же результат, что и подход подзапроса Гордона:

    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1 rank1
         3          4 rank1
         4          5 rank2
         5          6 rank2
         6          9 rank2
         7         10 rank3
         8         11 rank3
         9         15      
        10         16      

Как вы можете видеть, используя эти условия сравненияозначает, что нет совпадений для 15. Вы можете изменить их:

select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount > r.amnt1 and a.amount <= r.amnt2;

    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1      
         3          4 rank1
         4          5 rank1
         5          6 rank2
         6          9 rank2
         7         10 rank2
         8         11 rank3
         9         15 rank3
        10         16      

, но теперь нет совпадения для 1. Если вы попытаетесь получить оба с эквивалентом between:

select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2;

    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1 rank1
         3          4 rank1
         4          5 rank1
         4          5 rank2
         5          6 rank2
         6          9 rank2
         7         10 rank2
         7         10 rank3
         8         11 rank3
         9         15 rank3
        10         16      

теперь вы получаете несколько результатов из-за перекрывающихся строк.Вы можете избавиться от них, например, сохраняя «более высокий» рейтинг, когда есть более одного совпадения:

select a.deptid, a.amount,
  max(r.rank) keep (dense_rank last order by r.amnt1) as rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2
group by a.deptid, a.amount;

    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1 rank1
         3          4 rank1
         4          5 rank2
         5          6 rank2
         6          9 rank2
         7         10 rank3
         8         11 rank3
         9         15 rank3
        10         16      

Но, на самом деле, у вас не должно быть совпадений;или вам нужно определить, какой из результатов является правильным.(Вам может даже не понадобиться / не хотеть нижней границы вообще, если ваши данные всегда будут соответствовать чему-либо; но это также немного другой запрос.)

0 голосов
/ 23 октября 2018

Вам не нужно case.Вы можете использовать коррелированный подзапрос:

select (select rt.rank from ranktable rt where a.amount >= rt.amnt1 and a.amount < rt.amnt2) as ranking
from amount a;

Вы также можете сделать это как join.

...