【问题标题】:Two aggregation functions group by两个聚合函数分组
【发布时间】:2015-04-27 20:42:16
【问题描述】:

我正在尝试打印所有工资总和大于部门平均总和的部门名称。

SELECT d.department_name, SUM(e.salary)
FROM departments d, employees e
WHERE d.department_id = e.department_id
GROUP BY d.department_name
HAVING SUM(e.salary) > (SELECT AVG(SUM(salary)) from employees);

在第二次选择之后,我必须按AVG(SUM(salary)) 分组吗?

【问题讨论】:

标签: sql oracle


【解决方案1】:

您需要重复条件中的第一个查询。这可以通过 WITH 子句来完成。

WITH dept_sums AS (SELECT d.department_name, SUM(e.salary) sum_salary
FROM departments d, employees e
WHERE d.department_id = e.department_id
GROUP BY d.department_name)

SELECT * FROM dept_sums d_s_1 WHERE d_s_1.sum_salary > (SELECT AVG(sum_salary) FROM dept_sums d_s_2);

【讨论】:

    【解决方案2】:

    这是窗口(分析)函数派上用场的地方。下面我使用AVG()作为解析函数来计算所有部门的平均总工资。

    SELECT department_name, dept_salary FROM (
        SELECT d.department_name, SUM(e.salary) AS dept_salary
             , AVG(SUM(e.salary)) OVER ( ) AS avg_dept_salary
          FROM departments d INNER JOIN employees e
            ON d.department_id = e.department_id
         GROUP BY d.department_name
    ) WHERE dept_salary > avg_dept_salary;
    

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 2022-01-17
      • 2011-04-11
      • 1970-01-01
      • 2019-06-10
      • 2018-11-03
      • 2022-09-28
      • 2020-06-13
      相关资源
      最近更新 更多