我有以下关系:
emp:(eid:integer, ename:string, age:integer, salary:decimal(10,2))
作品:(eid:integer, did:integer, pct_time:integer)
部门:(did:integer, dname:string, budget:decimal(10,2), managerid:integer)
预期结果:
[创建一个视图ManagerSummary,该视图为每个部门列出部门名称,经理ID和经理名称,经理薪水以及该部门的雇员人数。该视图将包含五列,其标题为:DeptName,MgrID,MgrName,MgrSalary和EmpCount
我尝试过的事情:
Create View ManagerSummary(DeptName, MgrID, MgrName, MgrSalary, EmpCount)
AS Select D.dname, D.managerid, E.ename, E.salary, count(E.ename)
FROM Dept D, Emp E, Works W
Where D.did = w.did AND E.eid = w.eid
GROUP BY D.dname;
我想依靠员工,但是我不能只按部门分组。当我将部门,经理编号,员工姓名和薪水分组时,计数全部为1。这没有任何意义。
要获取经理信息,您想在dept(managerid)
上加入emp(eid)
。然后,您可以引入表works
并进行汇总。
考虑:
create view ManagerSummary(DeptName, MgrID, MgrName, MgrSalary, EmpCount)
as select
d.dname,
d.managerid,
e.ename,
e.salary,
count(*)
FROM dept d
inner join emp e on e.eid = d.managerid
inner join works w on d.did = w.did
group by
d.dname,
d.managerid,
e.ename,
e.salary
我将使用派生表进行聚合,然后加入该表。这样,您就无需按主查询中的所有列进行分组(而且通常也更快)。
通过使用外部联接,您还可以包括没有员工的部门(不知道是否可能发生这种情况:]
create view manager_summary
as
select d.dname as department_name,
e.eid as mgr_id,
e.ename as mgr_name,
e.salary as mgr_salary,
coalesce(w.num_employees,0) as emp_count
from dept d
join emp e on e.eid = d.managerid
left join (
select did, count(distinct eid) as num_employees
from works
group by did
) w on w.did = d.did