0

サンプル表と説明については、ここをクリックしてください。

添付の画像に従って、「PROJECTS」、「PROJECTMANAGER」、「MANAGERS」の3つのテーブルがあります。

PROJECTSTATUSでグループ化された「PRODUCT」タイプのマネージャーによって管理されているPROJECTを一覧表示できるクエリが必要です。STATUS = 2の場合は、完了プロジェクトまたは進行中のプロジェクトとして表示されます。

結果のテーブルは、添付の画像に示すようになります。望ましい結果:http ://www.dbasupport.com/forums/attachment.php?attachmentid = 588&d = 1336691473

クエリは、任意のデータベース(MySQL / Oracle / MSSQL / DB2)で使用できるように、汎用である必要があります。

助けてください。

ところで、これは宿題ではありません... !!!! サンプルテーブルを使用しました。

私はcasewhenステートメントで試しましたが、参加する方法がわからず、同時にgroupbyを使用します。

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          |
4

2 に答える 2

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フィドル

私はあなたが次のものを望んでいると思います:

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

デモ

于 2012-05-10T23:24:07.790 に答える
0

テーブルをINNERJOIN(project_idを使用してProject to Projectmanager、およびmanager_idを使用してprojectmanagerからmanager)で結合する必要があります。

次に、すべてをGROUPBYでグループ化します

T-SQLCASEステートメントも読んでください。STATUSフィールドを「Completed」または「NotCompleted」に変換するには、これ(またはIF)が必要です。

于 2012-05-10T23:22:01.247 に答える