簡體   English   中英

ORACLE SQL - 如何進行計數,但選擇的屬性多於我想要分組的屬性?

[英]ORACLE SQL - how do I make a count, but the select has more attributes than I want to group?

我有以下關系:

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; 

我想對員工進行計數,但我不能只對部門進行分組。 當我對部門、managerid、員工姓名和工資進行分組時,計數都將為 1。這沒有任何意義。

要獲取經理信息,您需要在emp(eid)上加入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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM