2017-09-03 17 views
0

以下に示すように、oracle DBに4つのテーブルがあり、EmployeeリストはオフィスID(m_officeにはオフィスIDとオフィス名が含まれています)にマップされています。すべてのオフィスは、部門または細分のいずれかです。再びすべての細分は部門に属します。最後の表に示されているように、部門別従業員数を調べる必要があります(部門数は従業員も含む必要があります)。4つの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 グループ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を使用して2つを結合し、オフィスと部門に関係する中間テーブルを取得します。

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; 
関連する問題