ORACLE SQL-如何进行计数,但选择的属性多于我要分组的属性?

问题描述 投票:0回答:2

我有以下关系:

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和经理名称,经理薪水以及该部门的雇员人数。该视图将包含五列,其标题为:DeptNameMgrIDMgrNameMgrSalaryEmpCount

我尝试过的事情:

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。这没有任何意义。

sql oracle group-by count
2个回答
0
投票

要获取经理信息,您想在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

0
投票

我将使用派生表进行聚合,然后加入该表。这样,您就无需按主查询中的所有列进行分组(而且通常也更快)。

通过使用外部联接,您还可以包括没有员工的部门(不知道是否可能发生这种情况:]

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
© www.soinside.com 2019 - 2024. All rights reserved.