I am using PL/SQL 12.
I want to decode a column value to match another column value. I take the highest value of the the columns SP_RANK
and MOODY_RANK
and call it RANK
. I want this column to instead of values have the corresponding value in either SP
or MOODYS
depending on which value is highest.
Below my code and a snippet of the data.
SELECT rv.updat , rv.instrumentid , greatest(nvl(rv.sp_rank, '-1') , nvl(rv.moody_rank, '-1')) AS "Rank" , rv.sp , rv.moodys , rv.SP_Rank , rv.Moody_Rank FROM ci.ratings_view rv ORDER BY rv.updat ASC
Table:
INSTRUMENTID | UPDAT | Rank | SP | MOODYS | SP_RANK | MOODY_RANK -------------+------------+------+-----+--------+---------+----------- 0203041 | 26/09/2019 | 100 | AAA | Aaa | 100 | 100 0203378 | 26/09/2019 | 100 | AAA | Aaa | 100 | 100 0203734 | 26/09/2019 | 100 | AAA | Aaa | 100 | 100 0204196 | 26/09/2019 | 100 | AAA | Aaa | 100 | 100 0204277 | 26/09/2019 | 100 | AAA | Aaa | 100 | 100 0413194 | 26/09/2019 | 75 | A | NR | 75 | -1 0413216 | 26/09/2019 | 75 | A | NR | 75 | -1 0413240 | 26/09/2019 | 75 | A | NR | 75 | -1 0460583 | 26/09/2019 | 100 | AAA | NR | 100 | -1 0460656 | 26/09/2019 | 100 | AAA | NR | 100 | -1 0471534A | 26/09/2019 | 100 | AAA | WR | 100 | -1 0491438 | 26/09/2019 | -1 | NR | NR | -1 | -1
So instead of 100
it should say AAA
and instead of 75
A
, etc.
Advertisement
Answer
You can do this with a CASE
statement:
select rv.updat, rv.instrumentid, greatest(nvl(rv.sp_rank,'-1'), nvl(rv.moody_rank,'-1')) as "Rank", rv.sp, rv.moodys, rv.SP_Rank, rv.Moody_Rank, CASE WHEN COALESCE(rv.moody_rank, -1) > COALESCE(rv.SP_Rank, -1) THEN rv.moodys ELSE rv.SP END AS NewRank from ci.ratings_view rv order by rv.updat asc
You may need to add some extra logic to handle ties — i.e. which rank to use (SP or Moodys)