Oracle SQL输出错误

时间:2016-06-21 04:47:21

标签: sql oracle

我无法产生这个问题的预期结果:

按字母顺序显示每位收入低于最佳工资雇员的员工的全名,工作,薪水,部门编号

  • 工会员工不是副总裁的经理主席 并且不在SALES或营销部门工作
  • 全名应显示为名字姓氏,其标题应为“员工”。
  • 应使用=符号左边填充工资,直到宽度为12个字符。它应该有一个别名Salary。
  • 薪水的格式为包含的货币金额。千位分隔符,但没有小数
  • 将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)

如果有人可以帮助我并指出我如何获得正确输出的正确方向,那将非常感激。谢谢!

2 个答案:

答案 0 :(得分: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,因为它没有任何用途

答案 1 :(得分:0)

这是人力资源架构,对吗?您需要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);