2015-10-22 86 views
2

我在練習sql,並且遇到了這個問題。我不確定的SQL邏輯,更具體地說,它似乎是我完全錯誤使用組。SQL錯誤,組的錯誤執行

問題: 在同一年齡段的所有員工中打印薪金最高的員工的姓名和年齡。

employee(sid, sname, sex, age, year, salary) 

第一次嘗試:

select E.sname, E.age 
from employee E 
where E.salary= max(E.salary) 
group by E.sname, E.age 

Error: Invalid SQL: ORA-00934: group function is not allowed here 

第二次嘗試

select E.sname, E.age 
from employee E 
group by E.sname, E.age 
having E.salary= max(E.salary) 
Error: Invalid SQL: ORA-00979: not a GROUP BY expression 
+0

使用子選擇來獲得最高工資。 – jarlh

+0

@jarih你能解釋我的實現有什麼問題嗎? – Sam

+0

@Sam它是無效的SQL - WHERE在分組之前執行,所以你不能有一個聚合,'HAVING'只適用於分組表達式或聚合。您必須使用其他方法(子選擇,分區等)來獲取每個組中具有最高值的記錄。 –

回答

2

這可能工作:

select E.sname, E.age 
from employee E 
where E.salary= 
    (select max(salary) 
    from employee a 
    where a.age = E.age 
    ) 
0

到這個問題的一個簡單的方法是使用解析函數rank

select sname, age, salary 
from (
select sname, age, salary, 
rank() over(partition by age order by salary desc) rnk 
from employee) t 
where rnk = 1 

或者糾正查詢你有

select E.sname, E.age, E.salary 
from employee E 
where (age, salary) in (select age,max(salary) from employee group by age) 
0

注意,使用GROUP BY對那些不屬於聚合函數中的字段,並且您不能在WHERE子句中使用聚合函數。

SELECT e1.name, e1.age 
    FROM employee e1, (SELECT age, MAX(salary) AS max_salary FROM employee GROUP BY age) e2 
WHERE e1.salary = e2.max_salary 
    AND e1.age = e2.age;