【问题标题】:Get MAX element based on two different tables根据两个不同的表获取 MAX 元素
【发布时间】:2014-10-26 01:22:09
【问题描述】:

我在 Oracle DB 上的 SQL 查询有问题。我有以下表格:

DEPARTMENT(`ID` NUMBER(11), `NAME` VARCHAR(25))    
EMPLOYEE(`ID` INT(11), `LASTNAME` VARCHAR(25), `DEP_ID` INT(11));
SALARIES(`ID` INT(11), `EMPLOYEE_ID` INT(11), `SALARY` INT(11));

现在,我想获得平均工资最高的部门名称。 Department 与 Salaries 没有直接关系,所以我可能还需要使用 Employee 表。

我创建了一个查询:

SELECT NAME, (SELECT SUM(SALARIES.SALARY) FROM SALARIES JOIN EMPLOYEE ON EMPLOYEE.EMPLOYEE_ID = EMPLOYEE.ID WHERE EMPLOYEE.DEP_ID = DEPARTMENT.ID GROUP BY EMPLOYEE.ID) AS AVG_OF_SUM FROM DEPARTMENT;

它返回部门名称和平均总和的列表。但现在我只需要为最高平均行获取一个部门名称。

我的查询真的可以吗?还是可以改进?我怎样才能只获得一条记录?

感谢您的帮助。

问候, D

【问题讨论】:

  • 什么是“最高平均金额”?

标签: sql oracle


【解决方案1】:

利用ANALYTIC函数SUM...OVER

在子查询中,应用解析函数,然后只选择你想要的那些行。

例如,

SELECT DISTINCT DEPT, SUM(SAL) OVER (PARTITION BY DEPT ORDER_BY DEPT) SUM_SAL FROM EMPLOYEE ORDER_BY DEPT;

【讨论】:

    【解决方案2】:
    SELECT NAME, (SELECT MAX(SUM(SALARIES.SALARY))
                  FROM SALARIES
                  JOIN EMPLOYEE ON EMPLOYEE.EMPLOYEE_ID = EMPLOYEE.ID )
                  WHERE EMPLOYEE.DEP_ID = DEPARTMENT.ID 
                  GROUP BY EMPLOYEE.ID) AS AVG_OF_SUM FROM DEPARTMENT;
    

    【讨论】:

      【解决方案3】:
      SELECT NAME, avg_sal FROM
          (SELECT d.NAME, avg(s.SALARY) avg_sal
            FROM SALARIES s
            JOIN EMPLOYEE e ON s.EMPLOYEE_ID = e.ID
            JOIN DEPARTMENT d ON e.DEP_ID = d.ID
          GROUP BY d.NAME
          ORDER BY 2 DESC)
      WHERE rownum = 1;
      

      (此查询显示平均工资最高的部门。如果需要 sum 替换 AVG -> SUM)

      【讨论】:

        猜你喜欢
        • 2021-06-21
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多