显示房地产经纪人的员工编号,姓名,年薪(年薪),月薪(月薪)和年龄(年龄)。将月薪四舍五入到小数点后两位。圆岁到岁。按员工年龄递减排序输出。如果记录上没有生日,则将年龄列为“未知”。 这是我必须回答的代码。
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关键字。
答案 0 :(得分:2)
您应该使用正在使用的DBMS标记SQL问题。根据{{1}},我得出结论是Oracle。当查询解析器认为DECODE
子句已完成,但没有ORA-00923 "FROM keyword not found where expected"
关键字时,您将得到SELECT
。那么,什么使DBMS认为FROM
子句已结束?当您在所选表达式之间缺少逗号时,通常会发生这种情况。
您的错误:
SELECT
之后缺少逗号。as "Monthly Salary"
,但查询中没有st.birthdate
表名或别名。我想列名是st
?更正的查询:
st_birthdate
您也可以使用标准SQL的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
。要从字面上应用“然后将年龄设为未知”,您必须将最后两个表达式结合起来。而且您错过了“将月薪四舍五入到小数点后两位”。
CASE WHEN
最后:我们通常不根据实际的实际时间来计算年龄。在4月1日出生的时候,我们在4月1日午夜每岁大一点。
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 :(得分:0)
回合结束后,您只需要在(
后面加上括号即可,因为回合的功能类似于
.. round(sysdate/362.25,0)
并检查用于评估Age列的逻辑,它应该是..decode(birthdate,round(sysdate..ontrue),null (onfalse)
之类的解码条件