Суть около decode()
заключается в том, что для каждой пары значений она заменяет второе значение первым. Таким образом, ваш опубликованный запрос сортирует «SENIOR DIRECTOR» в качестве «DIRECTOR», «MANAGER» в качестве «EMPLOYEE» и всех остальных случайным образом после этого.
Итак, вам нужно назначить порядок сортировки для каждого значения. Наиболее вероятный способ справиться с этим - назначить столбец SORT_ORDER таблице GRADE_DESCRIPTION, но это не всегда практично. Поэтому, если у вас есть только один или два отчета, которые должны быть отсортированы таким образом (кажется вероятным), тогда вы можете просто продолжить с жестко закодированными описаниями:
SELECT DISTINCT GRADE_DESCRIPTION
, HIRING_FORECATS.*
FROM GRADE_MASTER left join HIRING_FORECATS
ON (HIRING_FORECATS.GRADE = GRADE_MASTER.GRADE_DESCRIPTION
and HIRING_FORECATS.LOCATION = 'HO' )
order by decode
(GRADE_MASTER.GRADE_DESCRIPTION
, 'SENIOR DIRECTOR', 10
, 'DIRECTOR', 20
, 'MANAGER', 30
, 'EMPLOYEE', 40
, 100)
Хорошей идеей является включение значения по умолчанию, на всякий случай. Мне также нравится оставлять большие пропуски в числах сортировки, чтобы упростить добавление нового значения.