из ключевого слова в неправильном месте - PullRequest
0 голосов
/ 18 апреля 2019

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

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Вы должны пометить вопросы 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"
0 голосов
/ 18 апреля 2019

Вам просто нужна немедленная скобка ( после раунда, так как round - это функция, подобная

.. round(sysdate/362.25,0), и проверьте свою логику для оценки столбца Age, это должно быть какое-то условие декодирования, например ..decode(birthdate,round(sysdate..ontrue),null (onfalse)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...