【问题标题】:ORACLE SQL: Show the lowest salary in the department with the highest average salaryORACLE SQL:显示平均工资最高的部门工资最低
【发布时间】:2015-05-10 03:54:24
【问题描述】:

注意,这是一道作业题。

请显示平均工资为最高平均工资的部门的部门编号和最低工资。

这是我目前所拥有的,

SELECT DEPARTMENT_ID, MAX_AVG_SALARY
FROM
  (SELECT DEPARTMENT_ID, AVG(SALARY) AS MAX_AVG_SALARY
  FROM EMPLOYEES
  GROUP BY DEPARTMENT_ID)
WHERE MAX_AVG_SALARY =
  (SELECT MAX(MAX_AVG_SALARY)
  FROM
    (SELECT DEPARTMENT_ID,
      AVG(SALARY) AS MAX_AVG_SALARY
    FROM EMPLOYEES
    GROUP BY DEPARTMENT_ID
    ));

我可以得到工资最高的department_id,但是如何找到同一个部门的最低工资呢?

请帮忙!

谢谢!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    SELECT MINIMUM_SALARY,DEPARTMENT_ID
    FROM
    (
     SELECT AVG(SALARY) AS AVERAGE_SALARY,
            MIN(SALARY) AS MINIMUM_SALARY,
            DEPARTMENT_ID
      FROM EMPLOYEES
     GROUP BY DEPARTMENT_ID
    )EMPLOYEE_AGGREGATED
    WHERE
        AVERAGE_SALARY = (SELECT MAX(AVG(SALARY)) FROM EMPLOYEES GROUP BY DEPARTMENT_ID)
    

    【讨论】:

      【解决方案2】:

      analytic functions 的解决方案:

      select department_id, ms min_salary 
        from (
          select department_id, max(avg(salary)) over () mav,
              min(min(salary)) over (partition by department_id) ms, 
              min(avg(salary)) over (partition by department_id) av 
            from employees group by department_id )
        where av = mav order by department_id
      

      SQLFiddle demo

      【讨论】:

        【解决方案3】:

        您可以使用可以重复使用的命名子查询:

        WITH grouped_salaries AS (
          SELECT department_id,
                 MIN( salary ) AS min_dept_salary,
                 AVG( salary ) AS avg_dept_salary
          FROM   Employees
          GROUP BY department_id
        )
        SELECT department_id,
               min_dept_salary
        FROM   grouped_salaries
        WHERE  avg_dept_salary = ( SELECT MAX( avg_dept_salary )
                                   FROM   grouped_salaries );
        

        【讨论】:

          【解决方案4】:

          我会使用分析函数来解决这个问题,特别是row_number() 来获得平均工资最高的部门:

          select department_id, mins 
          from (select department_id, avg(salary) as avgs, min(salary) as mins,
                       row_number() over (order by avg(salary) desc) as seqnum
                from employees
                group by department_id
              ) de
          where seqnum = 1;
          

          【讨论】:

            【解决方案5】:
            select e.department_id, min(e.salary) min
              from employees e
            having avg(e.salary) = (select max(avg(e.salary))
                                      from employees e
                                     group by e.department_id)
             group by e.department_id
            

            【讨论】:

            【解决方案6】:
            WITH CTE(ID, SAL) AS 
            (
               SELECT DISTINCT
                  DEPARTMENT_ID,
                  AVG(SALARY) OVER(PARTITION BY DEPARTMENT_ID)"AVGSAL" 
               FROM
                  EMPLOYEES 
               ORDER BY
                  AVGSAL DESC
            )
            SELECT
               MIN(SALARY) 
            FROM
               EMPLOYEES E1 
            WHERE
               E1.DEPARTMENT_ID = 
               (
                  SELECT
                     ID 
                  FROM
                     CTE 
                  WHERE
                     ROWNUM = 1
               )
            ;
            

            【讨论】:

            【解决方案7】:

            这是不使用行限制功能的答案,因为旧的 oracle 不提供行限制功能

            SELECT job_id, avg(salary) FROM Employees 
            GROUP BY job_id 
            HAVING AVG(salary) = (SELECT MIN(AVG(salary)) FROM EMPLOYEES GROUP BY job_id);
            

            【讨论】:

              猜你喜欢
              • 2019-01-25
              • 2011-04-28
              • 2020-08-09
              • 2016-05-01
              • 2021-03-08
              • 2021-07-24
              • 2013-05-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多