2017-09-03 35 views
0

我有四個表,如下所示在oracle數據庫中,員工列表映射與辦公室ID(m_office包含辦公室ID和辦公室名稱)。所有的辦公室都是分區或分區。再次所有細分都屬於分部。我需要找出分工明智的員工數(分部數應該包括屬於分部的員工),如上表所示。加入四個SQL表

(因爲它的工作數據庫不能改變結構)。無法找到解決方案。任何幫助是非常可觀的。提前致謝。

TEST_EMPLOYEELIST

EmpId EmpName Office_id 
-------------------------------- 
1  Alex  O1 
2  John  O1 
3  Bob  O3 
4  Max  O5 
5  Nick  O5 
6  Jack  O1 
7  Paul  O2 

TEST_M_OFFICE

office_id office_name 
------------------------------ 
O1   Kamrup Division 
O2   Nalbari Division 
O3   Barpeta Division 
O4   Nalbari RR Subdivision 
O5   Barpeta SR Subdivision 
O6   Barpeta RR Subdivision 

TEST_DIVISION

division_id division_name 
----------------------------------- 
D1    Kamrup Division 
D2    Nalbari Division 
D3    Barpeta Division 
D4    Bongaigon Division 
D5    Rangia Division 

TEST_DIV_SUBDIV_MAPPING

subdivision_id subdivision_name   division_id 
------------------------------------------------------ 
S1    Nalbari RR Subdivision D2 
S2    Barpeta SR Subdivision D3 
S3    Barpeta RR Subdivision D3 
S4    Rangia RR Subdivision  D5 
S5    Kamrup RR Subdivision  D1 

要求:Division_wise記錄(包括細分計數)

division_name   count 
---------------------------- 
Kamrup Division   3 
Nalbari Division  1 
Barpeta Division  3 
Bongaigon Division  0 
Rangia Division   0 

這是我到目前爲止已經試過:

select b.office_name, 
     count(*) 
    from test_employeelist a, 
     test_m_office b 
where a.officeid = b.office_id 
group by b.office_name; 
+0

你到目前爲止嘗試過什麼..? –

+0

'select b.office_name,count(*)from test_employeelist a,test_m_office b其中a.officeid = b.office_id group by b.office_name;' 但是它只給出了辦公智能計數的細節。我無法找到如何映射TEST_DIV_SUBDIV_MAPPING表格中除法計數的解決方案。 –

+0

將以上評論添加到您的問題。 –

回答

1

試試這個。

SELECT division_name, 
     count(*) 
FROM 
    (SELECT b.office_name division_name 
    FROM test_employeelist a, 
     test_m_office b, 
     TEST_DIVISION c 
    WHERE a.office_id=b.office_id 
    AND b.office_name=c.division_name 
    UNION ALL 
    SELECT c.division_name division_name 
    FROM test_employeelist a, 
     test_m_office b, 
     TEST_DIVISION c, 
     TEST_DIV_SUBDIV_MAPPING d 
    WHERE a.office_id=b.office_id 
    AND b.office_name = d.subdivision_name 
    AND c.division_id = d.division_id) 
GROUP BY division_name; 
+0

'UNION ALL'是一個很好的答案。但是一個在1992年被取消的連接語法?真?別名a,b,c,d?這是非常糟糕的風格。別名是爲了*幫助*可讀性不妨礙它,所以使用助記符名稱。 –

0

這是一個非常糟糕的數據模型。由於不能在名稱上創建外鍵,因此簡單的打字錯誤會獲取不相關的記錄。

但是,您的辦公室是分部和分部的分部。使用UNION ALL將兩者結合起來以獲得與辦公室和部門相關的中間表。

select 
    dv.division_name, 
    count(e.empid) as employee_count 
from 
(
    select d.division_id, d.division_name, d.division_name as office_name 
    from test_division d 
    union all 
    select d.division_id, d.division_name, sd.subdivision_name as office_name 
    from test_div_subdiv_mapping sd 
    join test_division d on d.division_name = sd.division_id 
) dv 
join test_m_office o on o.office_name = dv.office_name 
left join test_employeelist e on e.office_id = o.office_id 
group by dv.division_id, dv.division_name;