из ключевого слова в неправильном месте

#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 , что предложение завершено? Обычно это происходит, когда вы пропускаете запятую между выбранными выражениями.

Ваши ошибки:

  1. После пропущена запятая as "Monthly Salary" .
  2. Ваш расчет возраста синтаксически отключен.
  3. Вы используете 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)