加入四个 SQL 表

Joining Four SQL Tables

我有四个 tables,如下所示,在 oracle 数据库中,员工列表与办公室 ID 映射(m_office 包含办公室 ID 和办公室名称)。所有办公室都是分部或分部。同样,所有细分都属于分部。我需要找出部门明智的员工人数(部门人数也应包括属于细分部门的员工),如最后 table.

所示

(因为它是一个工作数据库所以不能改变结构)。无法找到解决方案。非常感谢任何帮助。提前致谢。

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;

试试这个。

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;

这是一个非常糟糕的数据模型。由于无法在名称上创建外键,一个简单的拼写错误会导致记录不相关。

但是,您的办公室是部门,办公室是部门的分支机构。使用 UNION ALL 将两者结合起来得到中间 table 相关办公室和部门。

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;