我有项目 - 问题,一对多的关系。
我希望每个项目都有待处理的问题和已完成的问题。
那么,我做了什么
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
但它没有提供适当的输出。见下文。
对于已完成和待处理的问题,有两个单独的行,有时根据问题状态ID有两行(参见BT5)。
这种情况出错的情况是什么时候?
实现这一目标的正确方法是什么?
答案 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;
另外,我将表别名更改为更有意义的内容。请勿使用无意义的字母,例如a
和b
。使用表格缩写。