用一组sql计算平均值?

时间:2015-02-14 17:17:41

标签: sql oracle

我正在学习sql(不断,似乎!),我已经为以下任务设计了一个有效的解决方案。我只是想知道是否可以使用更简单的SQL查询来获得相同的解决方案,可能在我创建的视图上使用group by子句。我无法将group by与select子句中的avg()结合起来。想法?

问题:找出经理的姓名和他们管理的员工的平均工资。

表: 工作 - 包含三列:员工(其中一些也是经理),公司,薪水。 MANAGES - 包含两列:employee和该员工的经理。

我的临时视图 - 我在查询中创建的临时视图(managers_and_salaries)包含两列:经理名称和经理管理的每个员工的工资。因此,管理员名称在此视图中不是唯一的。部分内容如下;显然,它是b.s.数据:

    this is my temp view (partial).
    a view is NOT required, it's just the way I did it to keep my head straight:
    +------------------+--------+
    | MANAGER_NAME     | SALARY |
    +------------------+--------+
    | Lakshmi Mittal   | 400000 |
    | William Gates III| 300000 |
    | Mark Zuckerberg  | 450000 |
    | Mark Zuckerberg  | 120000 | etc, etc. (11 rows)

我的完整SQL查询(当然不需要这么复杂吗?)...

    with managers_and_salaries as (select m.manager_name, w.salary
                                   from manages m inner join works w on
                                                  m.employee_name = w.employee_name)
    select manager_name, avg(salary)
    from managers_and_salaries
    where manager_name in (select distinct manager_name
                           from managers_and_salaries)
    group by manager_name;

我的部分结果......再一次,它有效,我不禁想到我的sql可以简单得多......

    +------------------+-------------+
    | MANAGER_NAME     | AVG(SALARY) |
    +------------------+-------------+
    | Lakshmi Mittal   |      400000 |
    | Mark Zuckerberg  |      285000 |
    | William Gates III|      300000 | etc, etc, (8 rows)

这是我的第一篇文章,我希望我的问题很明确......我不确定我的格式是否会得到维护。对不起,如果事实证明不可读。感谢任何输入,肯定有一个更简单的查询将起作用。我正在用甲骨文这样做,顺便说一下,虽然我怀疑这里没什么区别,如果有的话。

1 个答案:

答案 0 :(得分:1)

from managers_and_salaries
where manager_name in (select distinct manager_name
                       from managers_and_salaries)

where子句是多余的:from子句已经确保只考虑来自managers_and_salaries的管理器。

删除该子句后,managers_and_salaries只使用一次,内联定义可能更简单:

select m.manager_name, avg(w.salary)
from manages m 
inner join works w on m.employee_name = w.employee_name
group by manager_name;