"找出满足如下条件的员工: 1.作为某个部门下属最多并且是工资最高的员工 (若有多个员工下属一样多,取工资最高的员工,也就是部门老大还是得是工资最高的) (排除0下属的员工) 查询的结果应该包括以下属性: 1.员工的编号 2.员工的firstname 3.员工的lastname 4.员工部门ID 5.员工直接领导与间接领导的员工的平均工资。(即, A是B的直接领导,B是C的直接领导,则A领导的员工包含B 和C,可以依次- -直类推下去,比如steven king是所有的领导,中间可能隔了很多层次。) 排序要求: 首先按照其领导的员工中工资的平均值(也就是属性第5条),降序;其次员工编号,升序;"
时间: 2024-03-24 20:41:10 浏览: 114
下面是一种 SQL 查询语句,可以实现您所需的功能:
```sql
SELECT e.EMPLOYEE_ID, e.FIRST_NAME, e.LAST_NAME, e.DEPARTMENT_ID, AVG(s.SALARY) AS AVG_SALARY
FROM EMPLOYEES e
JOIN (
SELECT DEPARTMENT_ID, MAX(SALARY) AS MAX_SALARY
FROM EMPLOYEES
WHERE MANAGER_ID IS NOT NULL
GROUP BY DEPARTMENT_ID
) m ON e.DEPARTMENT_ID = m.DEPARTMENT_ID AND e.SALARY = m.MAX_SALARY
LEFT JOIN (
SELECT MANAGER_ID, AVG(SALARY) AS AVG_SALARY
FROM (
SELECT DISTINCT e.MANAGER_ID, e.EMPLOYEE_ID
FROM EMPLOYEES e
START WITH e.MANAGER_ID = 100
CONNECT BY PRIOR e.EMPLOYEE_ID = e.MANAGER_ID
) c
JOIN EMPLOYEES e ON c.EMPLOYEE_ID = e.EMPLOYEE_ID
GROUP BY MANAGER_ID
) s ON e.EMPLOYEE_ID = s.MANAGER_ID
WHERE e.MANAGER_ID IS NOT NULL AND NOT EXISTS (
SELECT 1
FROM EMPLOYEES
WHERE MANAGER_ID = e.EMPLOYEE_ID
)
GROUP BY e.EMPLOYEE_ID, e.FIRST_NAME, e.LAST_NAME, e.DEPARTMENT_ID, s.AVG_SALARY
ORDER BY s.AVG_SALARY DESC NULLS LAST, e.EMPLOYEE_ID ASC;
```
该语句使用了多个表的 JOIN 操作,以及子查询、连接查询和递归查询。首先,使用子查询找到每个部门工资最高的员工,然后在 EMPLOYEES 表中进行多次 JOIN 操作,筛选出符合条件的员工信息,并按照领导的平均工资和员工编号进行排序。其中,左连接查询用于计算领导的员工的平均工资,而递归查询用于找到员工的所有下属。最终,查询结果包括员工的编号、firstname、lastname、部门ID和领导的员工的平均工资。
希望这个查询语句能够帮到您。
阅读全文