2015-09-29 49 views
2

我有一个查询需要添加一列到。我可以找到很多类似的例子,但是对于这种情况来说,没有什么比较合适。可能有无限的CategoryID,我需要添加由CategoryID分组的Sum(IsOutage)。这是一些示例数据::选择具有sum()作为子查询的查询

enter image description here

这里是得到它的工作最接近我:

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 

我是关闭?请告知并提前感谢名单

编辑:这是一个实物模型的结果应该是什么样子:

enter image description here

+1

如果你发布你想要的结果 – Lamak

+0

thanx Lamak,那会更好。 – Darkloki

+0

Lukas Eder和Darkloki展示了这种问题最好的方式。只有他们没有得到正确的结果,因为'i.StatusID = 3'。 StatusID的含义是什么? –

回答

1

如果我正确理解您的需要此查询应该给你想要的结果:

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 
+0

我应该注意“IsOutage “是一个位列,这导致”操作数数据类型位对于求和算子无效“。 – Darkloki

+0

将sum语句更改为vkp的“IsOutage = 1 then 1 else 0 end”的情况似乎可以解决问题。 Thnax再次 – Darkloki

+0

我更正了查询。现在它应该可以工作。 –

0

可以使用条件聚集。此外,你不应该group by totaloutages

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 
+0

Thanx的状态为答复,但这将返回“0”TotalOutages而不管数据 – Darkloki

0

你不需要这个计数的另一个子查询。算了算,你是感兴趣的行:

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 
+0

Thanx答复,但是无论数据如何,TotalOutages都会返回“0” – Darkloki

+0

@Darkloki我已根据您在另一个答案中给出的其他信息更新了查询... –

+0

仍然返回TotalOutages中的全部0 – Darkloki