2017-09-03 3 views
0

J'ai quatre tables comme indiqué ci-dessous dans DB oracle, la liste des employés est mappée avec des ID de bureau (m_office contient des ID de bureau et des noms Office). Tous les bureaux sont soit Division ou Subdivision. Encore Toutes les Subdivisions appartiennent aux Divisions. Je dois trouver le nombre d'employés par division (le nombre de divisions devrait inclure les employés appartenant à la subdivision aussi bien) comme indiqué dans le dernier tableau. (Comme sa base de données de travail ne peut donc pas changer la structure). Pas en mesure de trouver la solution. Toute aide est très appréciable. Merci d'avance.Joindre quatre tables 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 

requis: enregistrements Division_wise (y compris le nombre de subdivisions)

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

C'est ce que je l'ai essayé jusqu'à présent:

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

Qu'avez-vous essayé jusqu'à maintenant? –

+0

'sélectionner b.office_name, compter (*) à partir de test_employeelist a, test_m_office b où a.officeid = b.office_id groupe par b.office_name;' Mais il ne donne que des détails de comptage au bureau. Je ne suis pas en mesure de trouver une solution pour mapper le nombre de sous-divisions de la division à partir de la table TEST_DIV_SUBDIV_MAPPING. –

+0

Ajouter le commentaire ci-dessus à votre question. –

Répondre

1

essayer.

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' est une bonne réponse. Mais une syntaxe de jointure qui a été rendue redondante en 1992? Vraiment? Et les noms d'alias a, b, c, d? C'est un très mauvais style. Les noms d'alias sont destinés à * faciliter * la lisibilité pour ne pas l'entraver, utilisez donc des noms mnémoniques. –

0

Ceci est un très mauvais modèle de données. Comme on ne peut pas créer des clés étrangères sur les noms, une simple faute frappe des enregistrements sans rapport. Toutefois, vous avez donc des bureaux qui sont des divisions et des bureaux qui sont des subdivisions de divisions. Utilisez UNION ALL pour combiner les deux afin d'obtenir une table intermédiaire reliant bureau et division.

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;