2017-09-13 8 views
0

私はプロジェクト - 問題、1対多の関係を持っています。グループ別の場合は

プロジェクトごとに保留中の問題と完了した問題が必要です。

だから、私は

SELECT 
    a.id , 
    a.Name, 
    SUM(CASE WHEN b.StatusId = 3 THEN 1 ELSE NULL END) AS CompletedIssues, 
    SUM(CASE WHEN b.StatusId != 3 THEN 1 ELSE NULL END) AS PendingIssues 
FROM 
Projects a 
    JOIN Issues b 
     ON a.ID = b.ProjectId 
GROUP BY 
a.name, 
b.StatusId, 
a.ID 

をどのように行っている。しかし、それは適切な出力を与えていません。下のスナップを参照してください。

enter image description here

問題ステータスID(参照BT5)に基づいて完成し、懸案のための2つの別々の行と時々より2、その後の行があります。

このシナリオでは間違いがありますか?

これを達成するための適切な方法は何ですか?

答えて

2

あなたgroup by修正:

select p.id, p.Name, 
     sum(case when i.StatusId = 3 then 1 else null end) as CompletedIssues, 
     sum(case when i.StatusId <> 3 then 1 else null end) as PendingIssues 
from Projects p join 
    Issues i 
    on p.ID = i.ProjectId 
group by p.name, p.id; 

注:else NULLを望まないかもしれないが。通常は、カウントがゼロではなくNULLになりたい:

select p.id, p.Name, 
     sum(case when i.StatusId = 3 then 1 else 0 end) as CompletedIssues, 
     sum(case when i.StatusId <> 3 then 1 else 0 end) as PendingIssues 
from Projects p join 
    Issues i 
    on p.ID = i.ProjectId 
group by p.name, p.id; 

また、私はより意味のあるものに表の別名を変更しました。 abのような意味のない文字は使用しないでください。表の略語を使用する。

+0

これは、ありがとう、それは完璧な答えです。私は私のstatusIDに問題があります.. – Bharat

関連する問題