0

SQLクエリについて少し助けが必要です

これが状況です

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE  SALARY     CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06 1234.56    Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86 6661.78    Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90 6544.78    Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99 2344.78    Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98 2334.78    Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96 4322.78    New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98 7897.78    New York   Manager
08   James      Cat        17-SEP-96 15-APR-02 1232.78    Vancouver  Tester

8 rows selected.

SQL> -- GROUP BY clause and AVG() function

SQL> SELECT city, AVG(salary)
2 FROM employee
3 GROUP BY city;


CITY AVG(SALARY)
---------- -----------
New York 6110.28

Toronto 1234.56

Vancouver 3823.78

avg(salary)問題は、都市ごとに給与の高い名前を抽出する方法が見つからないことです。

例:

バンクーバーはavg(salary)3823.78なので、ニューヨークよりも給料が高いので、アリソンとジェームズの2人の名前を付ける必要がありますavg(salary)

今のところ、私はこのクエリに行くだけですが、機能していません

select FIRST_NAME,SALARY,CITY 
from employee 
where SALARY > (  select avg(SALARY) 
                  from employee 
                  group by CITY
                );

サブクエリが複数の値を返すことを教えてくれます

誰かが私を助けてくれることを願っています

4

1 に答える 1

2

クエリは複数の値を返しています。1つの値に制限するには、次の条件が必要ですcity

select FIRST_NAME,SALARY,CITY
from employee e
where SALARY > (select avg(SALARY) 
                from employee e2 
                where e2.city = e.city 
                group by CITY);

これは、相関サブクエリと呼ばれます。結合として記述することもできます。これは、私が使用する構文です。厳密に言えば不要ですが、サブクエリのgroup by CITY意図が明確になると思います。

次のようにして、これを結合として書き直すことができます。

select e.FIRST_NAME, e.SALARY, e.CITY
from employee e join
     (select city, avg(salary) as avgSalary
      from employee
      group by city
     ) ec
     on e.city = ec.city
where e.salary > ec.avgSalary

または、私のお気に入りの方法は何でしょうか。。。

select e.FIRST_NAME, e.SALARY, e.CITY
from (select e.*,
             avg(salary) over (partition by city) as avgSalary
      employee e
     ) e
where e.salary > e.avgSalary
于 2013-02-14T13:26:39.057 に答える