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