按案件分组

时间:2017-09-13 11:36:12

标签: sql tsql

我有项目 - 问题,一对多的关系。

我希望每个项目都有待处理的问题和已完成的问题。

那么,我做了什么

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)。

  

这种情况出错的情况是什么时候?

     

实现这一目标的正确方法是什么?

1 个答案:

答案 0 :(得分: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。使用表格缩写。