2016-06-21 66 views
0

我不能够产生这个问题的预期效果:的Oracle SQL输出错误

显示按字母顺序排列的姓名,职位,薪水,对于谁赚不到收入最高的工会组织员工

每个员工部门编号
  • 工会员工没有副总裁 的管理者总统和不销售或营销部门的工作
  • 全名应显示为名字姓氏,应该有标题的员工。
  • 工资应该用=符号填充,直到12个字符的宽度。它应该有一个别名薪水。
  • 工资被格式化为货币金额,包括。千分隔符,但不包含小数点
  • 将Employees名称的宽度限制为25个字符。

输出线应该是这样的样本行:

Jonathon Taylor  SA_REP ==== $8,600  80 

我的查询到目前为止:

select last_name || ', ' || first_name "full name", job_id, salary, department_id 
from employees 
where salary < ANY 
      (SELECT MAX(salary) 
      from employees e join departments d 
      where e.job_id <> 'AC_MGR' OR 'AD_VP' OR 'AD_PRES' 
      AND d.department_name <> 'SALES' OR 'MARKETING' 
      GROUP BY department_id) 

如果有人能帮助我,并指出我在如何正确的方向以获得正确的输出,这将不胜感激。谢谢!

+0

为什么在max子查询中分组? –

+0

围绕'OR'的Parens。实际上,表达式甚至不是有效的:你想'e.job不在'('AC_MGR','AD_VP','AD_PRES')'中。与'department_name'一样。并同意你也不需要“GROUP BY”。一旦你的子查询返回一行,'ANY'将不再是必需的。 – shawnt00

+0

ORA-00905:缺少关键字 00905. 00000 - “丢失的关键字” *原因: *动作: 行错误:6列:15 – 13design

回答

1
SELECT substr(first_name || ' ' || last_name, 1, 25) as NAME 
     , job_id 
     , lpad(to_char(salary, '$999,999.99'), 12, '=') as SALARY 
FROM employees 
WHERE salary < 
(
    SELECT MAX(salary) 
    FROM employees e INNER JOIN departments d 
     ON e.department_id = d.department_id 
    WHERE e.job_id NOT IN ('AC_MGR', 'AD_VP', 'AD_PRES') AND 
      d.department_name NOT IN ('SALES', 'MARKETING') 
) 

从你我定原始查询的一些问题:

  • 固定在SELECT串联,以符合您需要的输出
  • 增加了一个JOIN条件,因为你原来的查询做了CROSS JOIN(您可能不想要的)
  • OR替换为WHERE中的条件与WHERE ... NOT IN
  • 移除了子查询GROUP BY,因为它没有任何作用
+0

你会如何插入分隔符千分之一?即8,777美元。也限制名称为25个字符。谢谢 – 13design

+0

@ 13design通过将“名称”限制为25个字符,你的意思是什么?你知道全名是第一个和最后一个名字列的连接吗? –

+1

@TimBiegeleisen - OP指的是问题中包含的格式要求。具有讽刺意味的是,这些要求被问题文本中固定格式选项的混淆所困扰。 – APC

0

这是HR模式,正确的兄弟?您需要inner join员工部门与两个department_id匹配。您可以使用WITH语法进行查询:

with temp as (
select last_name || ', ' || first_name as "Full name", 
job_id, salary as slr, d.department_id 
from employees e inner join departments d on e.department_id=d.department_id 
where e.job_id NOT in ('AC_MGR','AD_VP','AD_PRES') 
and d.department_name NOT in ('SALES', 'MARKETING') 
) 
select * from temp where slr <= (select max(slr) from temp);