坚持我的查询

时间:2017-11-15 10:22:05

标签: sql oracle

如果有人能帮助我查询,我真的很感激。

我需要它来显示其他人的最高工资和工资之间的差异。

select e.ename, f.sal, e.sal 
from emp e , (select max(sal) as "sal" from emp) f
where 1=1 ;

我在哪里犯了错误?

提前致谢!

5 个答案:

答案 0 :(得分:3)

select
      name
    , sal
    , max_sal - sal as diff
from (
     select
          e.ename
        , e.sal 
        , max(salary) over() as max_sal
     from emp e
     ) d

我建议使用max(salary) over()解析(或窗口)函数将最大工资放在子查询的每一行上,然后用它来计算差值。这种聚合形式不需要group by clause

答案 1 :(得分:0)

select e.ename, 
       e.sal sal_of_others,
      (select max(sal) from emp where ename = e.ename ) - e.sal sal_diff 
  from emp e  

答案 2 :(得分:0)

无需在不必要的地方使用条件,也可以使用子查询,如下所示

SELECT e.ename, e.sal, (select max(sal) from emp) - E.Sal as difference 
FROM emp e 

答案 3 :(得分:0)

您可以使用分析函数来查找最高工资 - 这样就无需查询表格两次:

select ename,
       sal,
       max(sal) over () max_overall_sal,
       max(sal) over (partition by deptno) max_sal_per_dept
from   emp;

我已经给你两种方法来找到最高工资 - 一个在整个数据集(over ())和一个部门(over (partition by deptno)),因为我不确定你想要什么。

如果您不熟悉分析功能,我强烈建议您查阅它们。在它们的基本形式中,它们与聚合函数的工作方式类似,除了折叠行之外,它们报告每行的值。 partition by子句以与group by在聚合查询中相同的方式对数据进行分组。

答案 4 :(得分:0)

使用以下查询

select ename,sal,((select max(sal) from emp)-sal) as saldiff from emp