0

我应该让司机的工资高于按他们的状态排序的所有司机的平均工资。使用我编写的代码,我无法通过子查询使用“Order by”函数。显示将是司机姓名、司机身份和他们的薪水。这是我的代码

dr_status = the driver status
dr_drvname = driver name
dr_salary = driver salary
driver = driver table

select dr_drvname,dr_drvstatus,dr_salary
from driver
where dr_salary > (select avg(dr_salary) from driver group by dr_drvstatus)
group by dr_drvstatus;
4

4 回答 4

1

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

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;
于 2012-12-10T18:08:58.600 回答
1

不使用 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;

子查询将只执行一次以生成状态列表和该状态的平均工资。如果编写为相关子查询(如jonhopkins回答),您将面临优化器未发现子查询可以转换为非相关子查询的风险。

于 2012-12-11T00:06:09.697 回答
0

当您使用像 AVG() 这样的聚合函数时,您几乎不需要或希望该子查询具有“order by”或“group by”子句。它必须返回单个值以用于比较...您希望单个值的顺序是什么?它应该比较哪一个分组值?你让选择变得疯狂。;-)

尝试删除该位并查看...将子选择砍成这样:

(select avg(dr_salary) from driver)

于 2012-12-10T18:03:31.000 回答
0

我想你想要这样的东西?

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;
于 2012-12-10T18:06:19.440 回答