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;

サブクエリは、ステータスのリストとそのステータスの平均給与を生成するために 1 回だけ実行されます。相関サブクエリとして記述されている場合 ( jonhopkinsによる回答のように)、サブクエリを非相関サブクエリに変換できることをオプティマイザが認識しないリスクがあります。

于 2012-12-11T00:06:09.697 に答える
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 に答える
0

AVG() のような集計関数を使用している場合、そのサブクエリに「order by」または「group by」句を含める必要はほとんどありません。比較で使用される単一の値を返す必要があります...単一の値をどの順序で使用しますか? グループ化された値のどれを比較する必要がありますか? あなたはオプションでそれを狂わせています。;-)

そのビットを削除してみてください...サブセレクトをこれだけに切り詰めてください:

(select avg(dr_salary) from driver)

于 2012-12-10T18:03:31.000 に答える