2012-05-10 4 views
0

Please click here for sample tables and description.groupe SQL par requête avec JOIN

J'ai trois 'PROJETS tables, 'projectmanager' et MANAGERS » selon les images jointes.

J'ai besoin d'une requête qui peut répertorier les PROJETS gérés par les gestionnaires de type "PRODUCT" regroupés avec PROJECT STATUS. Si STATUS = 2, afficher en tant que projets terminés ou projets en cours.

La table obtenue doit ressembler à l'image ci-jointe. Résultat souhaité: http://www.dbasupport.com/forums/attachment.php?attachmentid=588&d=1336691473

La requête, j'ai besoin devrait être générique afin qu'il puisse être utilisé dans une base de données (MySQL/Oracle/MSSQL/DB2)

S'il vous plaît aider.

BTW, Ce n'est pas le devoir ... !!!! J'ai utilisé des tables d'échantillons.

J'ai essayé avec cas quand des instructions mais ne savez pas comment joindre et en même temps utiliser le groupe par.

CREATE TABLE PROJECTS 
(  
    PROJECT_ID varchar(20), 
    PROJECT_NAME varchar(30), 
    STATUS int 
); 

CREATE TABLE PROJECTMANAGER 
(
    PROJECT_ID varchar(20), 
    MANAGER_ID varchar(20) 
); 

CREATE TABLE MANAGERS 
(   
    MANAGER_ID varchar(20), 
    MANAGER_NAME varchar(20), 
    TYPE varchar(20) 
); 


INSERT INTO PROJECTS (PROJECT_ID, PROJECT_NAME, STATUS) VALUES 
    ('project_001', 'Project 001', 0), 
    ('project_002', 'Project 002', 1), 
    ('project_003', 'Project 003', 2), 
    ('project_004', 'Project 004', 0), 
    ('project_005', 'Project 005', 2), 
    ('project_006', 'Project 006', 0), 
    ('project_007', 'Project 007', 1); 


INSERT INTO PROJECTMANAGER (PROJECT_ID , MANAGER_ID) VALUES 
    ('project_001', 'mgr_001'), 
    ('project_002', 'mgr_001'), 
    ('project_001', 'mgr_002'), 
    ('project_002', 'mgr_003'), 
    ('project_001', 'mgr_003'), 
    ('project_005', 'mgr_001'), 
    ('project_004', 'mgr_002'); 

INSERT INTO MANAGERS (MANAGER_ID, MANAGER_NAME, TYPE) VALUES 
    ('mgr_001', 'Manager 001', 'PRODUCT'), 
    ('mgr_002', 'Manager 002', 'HR'), 
    ('mgr_003', 'Manager 003', 'PRODUCT'), 
    ('mgr_004', 'Manager 004', 'FINANCE'), 
    ('mgr_005', 'Manager 005', 'PRODUCT'); 



Resulted Table: 

MANAGER_ID | MANAGER _NAME | COMPLETED_PROJECTS | IN_PROGRESS_PROJECTS | 
mgr_001 | Manager 001 |  1  |   2   | 
mgr_003 | Manager 003 |  0  |   1   | 
mgr_005 | Manager 005 |  0  |   0   | 
+0

Avez-vous essayé un ything? –

Répondre

2

Puisque je ne peux pas voir le résultat final que vous voulez (il n'y a pas d'image affichée), alors vous pouvez faire quelque chose comme ceci:

select p.project_id 
    , p.project_name 
    , m.manager_name 
    , case when p.status = 2 then 'completed' else 'in progress' end as projectstatus 
from projects p 
left join projectmanager pm 
    on p.project_id = pm.project_id 
left join managers m 
    on pm.manager_id = m.manager_id 
WHERE m.type = 'Product' 

SQL Fiddle with Demo

Je pense que vous manquez les éléments suivants :

SELECT * 
    FROM 
    (
    select m.manager_id 
     , m.manager_name 
     , status 
     , case when status = '2' then 'Completed' else 'in progress' end as pstatus 
    from projects p 
    left join projectmanager pm 
     on p.project_id = pm.project_id 
    left join managers m 
     on pm.manager_id = m.manager_id 
    WHERE m.type = 'Product' 
) x 
    pivot 
    (
    count(status) 
    for pstatus in ([completed], [in progress]) 
) p 

DEMO

+0

J'ai mis à jour l'image. J'ai essayé de manipuler votre requête pour obtenir les résultats souhaités mais je n'ai pas pu. – user1373028

+0

Je ne vois pas d'image mise à jour. Pouvez-vous publier les résultats souhaités en question? – Taryn

+0

Résultats souhaités: http: //www.dbasupport.com/forums/attachment.php? Attachmentid = 588 & d = 1336691473 – user1373028

0

Vous devez joindre les tables avec des inner join (Projet à l'aide Projectmanager project_id et projectmanager à l'aide de gestionnaire manager_id).

Ensuite groupe tous ensemble avec GROUP BY

lire également sur l'instruction CASE T-SQL. Vous en avez besoin (ou un IF) pour convertir le champ STATUS en 'Terminé' ou 'Non terminé'.