2017-11-07 11 views
0

これは私の地獄です。どんな助けでも大歓迎です。3つのテーブルのSQL集約

私はいくつのプロジェクトIDとステップがあるかを調べようとしています。関係は以下のとおりです。

  • プロジェクト(N-1)ページ
  • ページ(n-1)の状態は

サンプルプロジェクトデータ

id name  
1 est et 
2 quia nihil 

サンプルページのデータ

からステップ
id project_id workflow_step_id  
1 1   1 
2 1   1 
3 1   2 
4 1   1 
5 2   3 
6 2   3 
7 2   4 

サンプルステップD ATA

id name 
1 a 
2 b 
3 c 
4 d 

予想される出力

project_id name count_steps 
1   a  3 
1   b  1 
2   c  2 
2   d  1 

ありがとう!

+0

あなたは疑問を持っていますか?どうした? –

+0

問題は私が必要な結果を得ていないことです。私はちょうどプロジェクトのID +ステップ名の総ページ数を返します。同一の値を持つページ数を持つプロジェクトID +ステップ名のリストではありません。 – Zagreus

+1

サンプルデータと希望の結果を追加できますか? – Cowthulhu

答えて

0

期待される結果を達成するアプローチ。 SQL Fiddle

CREATE TABLE Pages 
    ("id" int, "project_id" int, "workflow_step_id" int) 
; 

INSERT INTO Pages 
    ("id", "project_id", "workflow_step_id") 
VALUES 
    (1, 1, 1), 
    (2, 1, 1), 
    (3, 1, 2), 
    (4, 1, 1), 
    (5, 2, 3), 
    (6, 2, 3), 
    (7, 2, 4) 
; 


CREATE TABLE workflow_steps 
    ("id" int, "name" varchar(1)) 
; 

INSERT INTO workflow_steps 
    ("id", "name") 
VALUES 
    (1, 'a'), 
    (2, 'b'), 
    (3, 'c'), 
    (4, 'd') 
; 


CREATE TABLE Projects 
    ("id" int, "name" varchar(10)) 
; 

INSERT INTO Projects 
    ("id", "name") 
VALUES 
    (1, 'est et'), 
    (2, 'quia nihil') 
; 

クエリ1でも、それを参照してください。

select pg.project_id, s.name, pg.workflow_step_id, ws.count_steps 
from (
     select distinct project_id, workflow_step_id 
     from pages) pg 
inner join (
    select workflow_step_id, count(*) count_steps 
    from pages 
    group by workflow_step_id 
) ws on pg.workflow_step_id = ws.workflow_step_id 
inner join workflow_steps s on pg.workflow_step_id = s.id 
order by project_id, name, workflow_step_id 

Resultsを:

| project_id | name | workflow_step_id | count_steps | 
|------------|------|------------------|-------------| 
|   1 | a |    1 |   3 | 
|   1 | b |    2 |   1 | 
|   2 | c |    3 |   2 | 
|   2 | d |    4 |   1 | 
+0

私はそれを試して、残念ながら助けていない。 – Zagreus

+0

期待された結果を満たすために新しいapprochが追加されました –