Sql 根据司机状态显示工资高于司机平均工资的司机

Sql 根据司机状态显示工资高于司机平均工资的司机,sql,oracle,Sql,Oracle,我应该让司机的工资高于按其身份排序的所有司机的平均工资。。使用我编写的代码,我无法通过子查询使用Order by函数。显示屏将显示驾驶员姓名、驾驶员状态及其工资。这是我的密码 当您使用像AVG这样的聚合函数时,您几乎不需要或不希望该子查询具有ORDERBY或GROUPBY子句。它必须返回一个用于比较的值。。。您希望单个值按什么顺序排列?应在哪一个分组值上进行比较?你的选择太疯狂了 试着去掉那个部分,看看。。。切掉子选项,仅此项: 从driver中选择avgdr_salary我想你想要这样的东西

我应该让司机的工资高于按其身份排序的所有司机的平均工资。。使用我编写的代码,我无法通过子查询使用Order by函数。显示屏将显示驾驶员姓名、驾驶员状态及其工资。这是我的密码


当您使用像AVG这样的聚合函数时,您几乎不需要或不希望该子查询具有ORDERBY或GROUPBY子句。它必须返回一个用于比较的值。。。您希望单个值按什么顺序排列?应在哪一个分组值上进行比较?你的选择太疯狂了

试着去掉那个部分,看看。。。切掉子选项,仅此项:


从driver中选择avgdr_salary

我想你想要这样的东西

select dr_drvname,dr_drvstatus,dr_salary, avg_sal
  from (select dr_drvname,dr_drvstatus,dr_salary, 
               avg(salary) over (partition by dr_drvstatus) avg_sal
          from driver)
 where dr_salary > avg_sal;

我很确定你可以做这样的事

select dr_drvname,dr_drvstatus,dr_salary
from driver d1
where dr_salary > (
    select avg(dr_salary) from driver d2
    where d2.dr_drvstatus = d1.dr_drvstatus
)
group by dr_drvstatus;

不使用OLAP函数并避免相关子查询,我可能会这样写:

SELECT d.dr_drvname, d.dr_drvstatus, d.dr_salary
  FROM driver AS d
  JOIN (SELECT d2.dr_drvstatus, AVG(d2.dr_salary) AS avg_salary
          FROM driver AS d2
         GROUP BY d2.dr_drvstatus
       ) AS a ON d.dr_drvstatus = a.dr_drvstatus
 WHERE d.dr_salary < a.avg_salary;

子查询只执行一次,以生成状态列表和该状态的平均工资。如果像在by中那样以相关子查询的形式编写,那么优化器可能会发现该子查询无法转换为非相关子查询。

您可以为我们提供DDL和DML吗?在选择计算平均值时,为什么要尝试按dr_drvstatus排序?这不会只返回一个值吗?那里没有什么可订购的。我不能使用的意思是什么?你有错误吗?如果是这样的话,它到底说了什么?我需要根据他们的状态来订购平均工资,这是之前的一次又一次的支付,并且不保留。我想你可能正在寻找group Byp,就是这样。谢谢有些函数我不知道如何以某种方式编写。这很有帮助,谢谢你。这也很有效。谢谢你的帮助!
SELECT d.dr_drvname, d.dr_drvstatus, d.dr_salary
  FROM driver AS d
  JOIN (SELECT d2.dr_drvstatus, AVG(d2.dr_salary) AS avg_salary
          FROM driver AS d2
         GROUP BY d2.dr_drvstatus
       ) AS a ON d.dr_drvstatus = a.dr_drvstatus
 WHERE d.dr_salary < a.avg_salary;