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