すべての部門の平均賃金を取得し、平均賃金が最も高い部門のみを表示することになっています。このクエリを見つけましたが、機能しません。アイデアはありますか?
SELECT department, max(avg(wage))
FROM employees
GROUP BY department;
次のエラーが表示されます: ERROR at line 1: ORA-00937: not a single-group group function
CTE がなければ、次のことができます。
Select Z.Department, Z.AvgWage
From (
Select Department, Avg(Wage) AvgWage
From Employees
Group By Department
) As Z
Where AvgWage = (
Select Max(Z1.AvgWage)
From (
Select Department, Avg(Wage) AvgWage
From Employees
Group By Department
) Z1
)
CTE を使用すると、次のことができます。
With AvgWages As
(
Select Department
, Avg(Wage) AvgWage
, Rank() Over( Order By Avg(Wage) Desc ) WageRank
From Employees
Group By Department
)
Select Department, AvgWage, WageRank
From AvgWages
Where WageRank = 1
これは機能しますか:
select *
from
(
SELECT
department
, avg(wage) as ave_wage
FROM employees
GROUP BY department
)x
order by ave_wage desc
where rownum < 2;
(免責事項:完全にテストされていないため、rownumビットを間違った場所に置いた可能性があります)
以下のクエリは他の回答と同じ結果を示していますが、代わりにどのように実行できるかをユーザーに示すのは良いことです:
--Method 1 (Davek's select of 1st row over Order by) Brilliant!
--Method 2 (Thomas' where = sub-query result)
--Method 3 (Thomas' based on ranking)
--Method 4 (Inner join sub-queries)
select distinct a.department, a.wage from
(select distinct department, AVG(wage) as wage from employees group by department) as a
inner join
(select Max(wage) as wage from
(select distinct department, AVG(wage) as wage from employees group by department) as x) as b
on a.wage = b.wage
where a.wage = b.wage
--Method 5 (AVG wage in (sub-query))
select distinct a.department, a.wage
from (select distinct department, AVG(wage) as wage from employees group by department) as a
Where a.wage in
(select Max(wage) as wage from
(select distinct department, AVG(wage) as wage from employees group by department) as x)
この選択のカスタム関数も楽しみにしています:)
グーグルで...
原因: SELECT リストには、グループ関数 (AVG、COUNT、MAX、MIN、SUM、STDDEV、または VARIANCE など) と個々の列式の両方を含めることはできません。ただし、個々の列式が GROUP BY 句に含まれている場合を除きます。
処置: SELECTリストからグループ関数または個々の列式を削除するか、リストされたすべての個々の列式を含むGROUP BY句を追加してください。