Sql :选择sum()作为子查询的查询

Sql :选择sum()作为子查询的查询,sql,sql-server-2008,Sql,Sql Server 2008,我有一个需要添加列的查询。我可以找到许多类似的例子,但没有什么适合这种情况。可能有无限个CategoryID,我需要添加按CategoryID分组的总和(IsOutage)。以下是一些示例数据: 这是我最接近于让它发挥作用的地方: SELECT c.CategoryID , c.Name , COUNT(i.IssueID) AS TotalIssues , AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration ,(

我有一个需要添加列的查询。我可以找到许多类似的例子,但没有什么适合这种情况。可能有无限个CategoryID,我需要添加按CategoryID分组的总和(IsOutage)。以下是一些示例数据:

这是我最接近于让它发挥作用的地方:

SELECT     c.CategoryID
, c.Name
, COUNT(i.IssueID) AS TotalIssues
, AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
,(Select COUNT(h.IssueID) From dbo.hdIssues AS h Where h.CategoryID = i.CategoryID AND IsOutage = 1 ) AS TotalOutages

FROM         dbo.hdCategories AS c INNER JOIN
                  dbo.hdIssues AS i ON c.CategoryID = i.CategoryID
WHERE     (i.StatusID = 3)
GROUP BY c.CategoryID, c.Name, TotalOutages
我接近了吗?请提前通知我和thanx

编辑:这是一个模拟结果的样子:


您可以使用条件聚合。此外,您不应该按总停机进行分组

SELECT    
c.CategoryID
, c.Name
, COUNT(i.IssueID) AS TotalIssues
, AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
,sum(case when IsOutage = 1 then 1 else 0 end) AS TotalOutages
FROM dbo.hdCategories AS c INNER JOIN
dbo.hdIssues AS i ON c.CategoryID = i.CategoryID
WHERE i.StatusID = 3
GROUP BY c.CategoryID, c.Name

此计数不需要另一个子查询。只需数一数您感兴趣的行:

COUNT(CASE WHEN i.IsOutage = 1 THEN 1 END)
在查询的上下文中:

SELECT     
  c.CategoryID
, c.Name
, COUNT(i.IssueID) AS TotalIssues
, AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
, COUNT(CASE WHEN CONVERT(INT, i.IsOutage) = 1 THEN 1 END) AS TotalOutages
FROM 
  dbo.hdCategories AS c 
INNER JOIN
  dbo.hdIssues AS i 
    ON c.CategoryID = i.CategoryID
WHERE 
  i.StatusID = 3
GROUP BY 
  c.CategoryID
, c.Name

如果我正确理解您的需求,此查询将为您提供所需的结果:

SELECT  x.* ,
        y.SumIsOutage

FROM    (SELECT c.CategoryID ,
                c.Name ,
                COUNT(i.IssueID) AS TotalIssues ,
                AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
        FROM    dbo.hdCategories AS c 
                INNER JOIN  dbo.hdIssues AS i ON c.CategoryID = i.CategoryID
        WHERE     (i.StatusID = 3)
        GROUP BY c.CategoryID, c.Name ) x
        LEFT JOIN   (SELECT DISTINCT i.CategoryId,
                    SUM(CONVERT(INT,i.isOutage)) OVER (PARTITION BY i.CategoryId) AS SumIsOutage
                    FROM dbo.hdIssues AS i ) y
        ON x.CategoryId = y.CategoryId

如果你发布你想要的结果会更好,就像Eder和Darkloki展示了解决这个问题的最佳方法一样。只是由于
i.StatusID=3
,它们无法得到正确的结果。StatusID的含义是什么?出于这个目的,它是不相关的,可能已经被编辑掉了。。在我的实际场景中,它表示回复的状态为“已解决”Thanx,但无论回复的数据Thanx如何,总停机都返回“0”,但返回“0”对于总停机,不考虑data@Darkloki我已经根据您在另一个答案中给出的其他信息更新了查询…仍然返回TotalOutages中的所有0我应该注意到“IsOutage”是一个位列,这将导致“操作数数据类型bit对于sum运算符无效”。将sum语句更改为vkp的“case when IsOutage=1然后1 else 0 end”似乎是个好办法。Thnax为什么要在第二个派生表中使用窗口函数和
DISTINCT
,而不仅仅是
GROUP BY