【问题标题】:ORACLE SQL - how do I make a count, but the select has more attributes than I want to group?ORACLE SQL - 我如何计算,但选择的属性比我想要分组的多?
【发布时间】:2019-12-10 21:57:36
【问题描述】:

我有以下关系:

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; 

我想统计员工人数,但我不能只按部门分组。当我对部门、经理ID、员工姓名和薪水进行分组时,计数都是1。这没有任何意义。

【问题讨论】:

    标签: sql oracle group-by count


    【解决方案1】:

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

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

    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
    

    【讨论】:

      【解决方案2】:

      要获取经理信息,您想在emp(eid) 上加入dept(managerid)。然后你可以带入表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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2022-01-26
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        • 1970-01-01
        相关资源
        最近更新 更多