【问题标题】:Oracle SQL output wrongOracle SQL 输出错误
【发布时间】:2016-06-21 04:47:21
【问题描述】:

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

按字母顺序显示每个收入低于最高薪工会员工的员工的全名、工作、薪水、部门编号

  • 加入工会的员工不是副总裁的经理总裁 不要在销售或营销部门工作
  • 全名应显示为 Firstname Lastname,并且应具有标题 Employee。
  • Salary 应该在左边用 = 符号填充,直到 12 个字符的宽度。它应该有一个别名 Salary。
  • salary 被格式化为货币金额,包括。千位分隔符,但没有小数
  • 将员工姓名的宽度限制为 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)

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

【问题讨论】:

  • 为什么要在最大子查询中分组?
  • ORs 周围的括号。实际上,该表达式甚至无效:您想要e.job not in ('AC_MGR', 'AD_VP', 'AD_PRES')。与department_name 相同。并同意您也不需要GROUP BY。一旦您的子查询返回单行,ANY 将不再需要。
  • ORA-00905:缺少关键字 00905. 00000 - “缺少关键字” *原因:*操作:第 6 行错误:15 列
  • 我得到那个错误纠正你提到的内容

标签: sql oracle


【解决方案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(您可能不想要)
  • WHERE 中的OR 条件替换为WHERE ... NOT IN
  • 从子查询中删除 GROUP BY,因为它没有任何用途

【讨论】:

  • 如何插入千分位分隔符?即 8,777 美元。还将名称限制为 25 个字符。谢谢
  • @13design 将“名称”限制为 25 个字符是什么意思?您确实意识到全名是名字和姓氏列的串联?
  • @TimBiegeleisen - OP 指的是问题中包含的格式要求。具有讽刺意味的是,这些要求被问题文本中糟糕的格式选择所混淆,现在已修复。
【解决方案2】:

这是 HR 模式,对吧兄弟?您需要 inner join EmployeesDepartmentsdepartment_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);

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多