2012-05-10 178 views
0

Please click here for sample tables and description.SQL GROUP BY查詢與加入

我有三個表「項目」, 'PROJECTMANAGER' 和「經理人按照附加圖片。

我需要一個查詢,它可以列出項目管理的「產品」類型管理器與項目狀態分組。 如果STATUS = 2,則顯示爲已完成項目或正在進行的項目。

結果表應該看起來像附圖所示。 所需的結果:http://www.dbasupport.com/forums/attachment.php?attachmentid=588&d=1336691473

查詢,我需要的應該是通用的,所以它可以在任何數據庫(MySQL的/甲骨文/ MSSQL/DB2)

請指導下使用。

順便說一句,這不是作業...... !!!! 我用過樣品表。

我已經嘗試過用case語句,但不知道如何加入並同時使用group by。

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

您有試過ything? –

回答

2

因爲我看不到你想要的(沒有投稿的圖像)的最終結果,那麼你可以做這樣的事情:

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

我覺得你是想以下:

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

我已更新圖像。我試圖操縱你的查詢來獲得想要的結果,但無法做到。 – user1373028

+0

我沒有看到更新的圖像。你可以發佈有問題的結果嗎? – Taryn

+0

期望的結果:http://www.dbasupport.com/forums/attachment.php?attachmentid = 588&d = 1336691473 – user1373028

0

你需要加入表連同內部連接(Project以Projectmanager使用PROJECT_ID,並projectmanager使用管理經理標識)。

然後組所有與GROUP BY一起

而且在T-SQL CASE語句讀了。您需要它(或IF)將STATUS字段轉換爲'Completed'或'Not Completed'。