#sql #oracle
#sql #Oracle
Вопрос:
Отобразите номер, имя, годовую зарплату в качестве годовой зарплаты, месячную зарплату в качестве месячной зарплаты и возраст в качестве возраста. Округлите месячную зарплату до 2 знаков после запятой. Округлите возраст до лет. Сортировка выходных данных по возрасту сотрудников по убыванию. Если в записи нет даты рождения, укажите возраст как «Неизвестный». Это код, который я должен ответить на вопрос.
select st_staffno, st_name, st_salary "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;
Он возвращает ключевое слово From, не найденное там, где ожидалась ошибка.
Комментарии:
1. Вы пропускаете a
,
в конце первой строки (послеas "Monthly Salary"
)2. Отличный метод отладки sql — начать удалять части вашего запроса, пока он не будет выполнен успешно. Это поможет вам сузить круг до частей, вызывающих синтаксическую ошибку.
3. выберите st_staffno, st_name, st_salary «Годовая зарплата», округлите (st_salary / 12,0) как «Месячная зарплата», расшифруйте (st_birthdate, null, ‘unknown’, (round ((sysdate — st_birthdate)/ 365.25,0))) как «Возраст» из приказа по персоналу по «возрасту» desc;
4. измените st_salary «Годовая зарплата» на st_salary как «Годовая зарплата»
Ответ №1:
Вы должны пометить 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"
Ответ №2:
Вам просто нужна немедленная скобка (
после раунда, так как round — это функция, подобная
.. round(sysdate/362.25,0)
и проверьте свою логику для оценки столбца Age, это должно быть какое-то условие декодирования, например ..decode(birthdate,round(sysdate..ontrue),null (onfalse)