Вы должны пометить вопросы SQL используемой СУБД.С DECODE
я делаю вывод, что это Oracle.Вы получаете ORA-00923 "FROM keyword not found where expected"
, когда анализатор запросов считает, что предложение SELECT
завершено, но ключевое слово FROM
не следует.Так что может заставить СУБД думать, что предложение SELECT
закончено?Обычно это происходит, когда вы пропускаете запятую между выбранными выражениями.
Ваши ошибки:
- Отсутствует запятая после
as "Monthly Salary"
. - Ваш возрастрасчет синтаксически отключен.
- Вы используете
st.birthdate
, но в вашем запросе нет имени или псевдонима таблицы st
.Я предполагаю, что имя столбца st_birthdate
?
Исправленный запрос:
select
st_staffno,
st_name,
st_salary as "Annual Salary",
st_salary / 12 as "Monthly Salary"
decode(st_birthdate, null, 'unknown'),
round((sysdate - st_birthdate) / 365.25, 0) as "Age"
from staff
order by "Age" desc;
Вместо DECODE
вы также можете использовать стандартные SQL CASE WHEN
.И чтобы буквально применить «затем указать возраст как неизвестный», вам нужно объединить два последних выражения.И вам не хватает «округлить месячную зарплату до 2 знаков после запятой».
select
st_staffno,
st_name,
st_salary as "Annual Salary",
round(st_salary / 12, 2) as "Monthly Salary"
case when st_birthdate is null
then 'unknown'
else to_char(round((sysdate - st_birthdate) / 365.25, 0))
end as "Age"
from staff
order by st_birthdate nulls last;
Наконец: мы обычно не рассчитываем возраст по реальной длине года.Рожденные 1 апреля, мы становимся на год старше 1 апреля в полночь.
extract(year from sysdate) - extract(year from st_birthdate) -
case when to_char(sysdate, 'mmdd') < to_char(st_birthdate, 'mmdd')
then 1 else 0
end as "Age"